[{"data":1,"prerenderedAt":2757},["ShallowReactive",2],{"navigation_docs":3,"-docs-essentials-logging":493,"-docs-essentials-logging-surround":2752},[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":121,"body":495,"description":2745,"extension":2746,"links":2747,"meta":2748,"navigation":2749,"path":122,"seo":2750,"stem":123,"__hash__":2751},"docs\u002Fdocs\u002F02.essentials\u002F17.logging.md",{"type":496,"value":497,"toc":2734},"minimark",[498,507,708,715,723,728,731,821,887,906,913,920,1276,1283,1289,1296,1300,1311,1396,1414,1461,1477,1501,1525,1529,1535,1617,1715,1722,1726,1754,1960,1991,2009,2251,2254,2258,2271,2566,2575,2603,2607,2613,2619,2630,2636,2662,2675,2679,2730],[499,500,501,502,506],"p",{},"Every class can write a tagged, level-gated log line, and the same call renders as a readable terminal line in\ndevelopment or one line of JSON for your log aggregator in production — you choose the shape once at boot, not at\nevery call site. A logger is a plain object you construct in a field; it is ",[503,504,505],"strong",{},"not"," a DI provider, because the\nlevel and output format are process-wide settings, not per-instance dependencies.",[508,509,515],"pre",{"className":510,"code":511,"filename":512,"language":513,"meta":514,"style":514},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Logger } from \"@heximon\u002Fruntime\";\n\nexport class UsersService {\n  private readonly logger = new Logger(\"UsersService\");\n\n  public async create(input: CreateUser): Promise\u003CUser> {\n    this.logger.log(\"creating user\");\n    \u002F\u002F …\n  }\n}\n","users.service.ts","ts","",[516,517,518,554,561,578,614,619,660,689,696,702],"code",{"__ignoreMap":514},[519,520,523,527,531,535,538,541,544,548,551],"span",{"class":521,"line":522},"line",1,[519,524,526],{"class":525},"s7zQu","import",[519,528,530],{"class":529},"sMK4o"," {",[519,532,534],{"class":533},"sTEyZ"," Logger",[519,536,537],{"class":529}," }",[519,539,540],{"class":525}," from",[519,542,543],{"class":529}," \"",[519,545,547],{"class":546},"sfazB","@heximon\u002Fruntime",[519,549,550],{"class":529},"\"",[519,552,553],{"class":529},";\n",[519,555,557],{"class":521,"line":556},2,[519,558,560],{"emptyLinePlaceholder":559},true,"\n",[519,562,564,567,571,575],{"class":521,"line":563},3,[519,565,566],{"class":525},"export",[519,568,570],{"class":569},"spNyl"," class",[519,572,574],{"class":573},"sBMFI"," UsersService",[519,576,577],{"class":529}," {\n",[519,579,581,584,587,591,594,597,599,602,604,607,609,612],{"class":521,"line":580},4,[519,582,583],{"class":569},"  private",[519,585,586],{"class":569}," readonly",[519,588,590],{"class":589},"swJcz"," logger",[519,592,593],{"class":529}," =",[519,595,596],{"class":529}," new",[519,598,534],{"class":589},[519,600,601],{"class":533},"(",[519,603,550],{"class":529},[519,605,606],{"class":546},"UsersService",[519,608,550],{"class":529},[519,610,611],{"class":533},")",[519,613,553],{"class":529},[519,615,617],{"class":521,"line":616},5,[519,618,560],{"emptyLinePlaceholder":559},[519,620,622,625,628,631,633,637,640,643,646,649,652,655,658],{"class":521,"line":621},6,[519,623,624],{"class":569},"  public",[519,626,627],{"class":569}," async",[519,629,630],{"class":589}," create",[519,632,601],{"class":529},[519,634,636],{"class":635},"sHdIc","input",[519,638,639],{"class":529},":",[519,641,642],{"class":573}," CreateUser",[519,644,645],{"class":529},"):",[519,647,648],{"class":573}," Promise",[519,650,651],{"class":529},"\u003C",[519,653,654],{"class":573},"User",[519,656,657],{"class":529},">",[519,659,577],{"class":529},[519,661,663,666,669,672,676,678,680,683,685,687],{"class":521,"line":662},7,[519,664,665],{"class":529},"    this.",[519,667,668],{"class":533},"logger",[519,670,671],{"class":529},".",[519,673,675],{"class":674},"s2Zo4","log",[519,677,601],{"class":589},[519,679,550],{"class":529},[519,681,682],{"class":546},"creating user",[519,684,550],{"class":529},[519,686,611],{"class":589},[519,688,553],{"class":529},[519,690,692],{"class":521,"line":691},8,[519,693,695],{"class":694},"sHwdD","    \u002F\u002F …\n",[519,697,699],{"class":521,"line":698},9,[519,700,701],{"class":529},"  }\n",[519,703,705],{"class":521,"line":704},10,[519,706,707],{"class":529},"}\n",[499,709,710,711,714],{},"The label you pass (",[516,712,713],{},"\"UsersService\"",") tags every line, so a log tells you which class wrote it without repeating\nthe name in each call:",[508,716,721],{"className":717,"code":719,"language":720,"meta":514},[718],"language-text","[UsersService] creating user\n","text",[516,722,719],{"__ignoreMap":514},[724,725,727],"h2",{"id":726},"pick-a-level","Pick a level",[499,729,730],{},"A logger exposes these methods, coarsest to finest. Each forwards the message plus any extra arguments to the\nactive backend:",[732,733,734,748],"table",{},[735,736,737],"thead",{},[738,739,740,745],"tr",{},[741,742,744],"th",{"align":743},"left","Method",[741,746,747],{"align":743},"Use it for",[749,750,751,762,772,792,801,811],"tbody",{},[738,752,753,759],{},[754,755,756],"td",{"align":743},[516,757,758],{},"error",[754,760,761],{"align":743},"A failure that needs attention. Always emitted.",[738,763,764,769],{},[754,765,766],{"align":743},[516,767,768],{},"warn",[754,770,771],{"align":743},"A recoverable problem or a deprecation.",[738,773,774,779],{},[754,775,776],{"align":743},[516,777,778],{},"success",[754,780,781,782,785,786,788,789,791],{"align":743},"A green ",[516,783,784],{},"✔"," milestone (a startup banner). Shown at ",[516,787,675],{}," visibility despite the ",[516,790,784],{}," styling.",[738,793,794,798],{},[754,795,796],{"align":743},[516,797,675],{},[754,799,800],{"align":743},"The default informational line (a request served, a job done).",[738,802,803,808],{},[754,804,805],{"align":743},[516,806,807],{},"debug",[754,809,810],{"align":743},"Detail you want while diagnosing, off in production.",[738,812,813,818],{},[754,814,815],{"align":743},[516,816,817],{},"verbose",[754,819,820],{"align":743},"The finest tracing.",[508,822,824],{"className":510,"code":823,"language":513,"meta":514,"style":514},"this.logger.warn(\"retrying payment\", { attempt });\nthis.logger.debug(\"cache miss\", key);\n",[516,825,826,861],{"__ignoreMap":514},[519,827,828,831,833,835,837,839,841,844,846,849,851,854,857,859],{"class":521,"line":522},[519,829,830],{"class":529},"this.",[519,832,668],{"class":533},[519,834,671],{"class":529},[519,836,768],{"class":674},[519,838,601],{"class":533},[519,840,550],{"class":529},[519,842,843],{"class":546},"retrying payment",[519,845,550],{"class":529},[519,847,848],{"class":529},",",[519,850,530],{"class":529},[519,852,853],{"class":533}," attempt ",[519,855,856],{"class":529},"}",[519,858,611],{"class":533},[519,860,553],{"class":529},[519,862,863,865,867,869,871,873,875,878,880,882,885],{"class":521,"line":556},[519,864,830],{"class":529},[519,866,668],{"class":533},[519,868,671],{"class":529},[519,870,807],{"class":674},[519,872,601],{"class":533},[519,874,550],{"class":529},[519,876,877],{"class":546},"cache miss",[519,879,550],{"class":529},[519,881,848],{"class":529},[519,883,884],{"class":533}," key)",[519,886,553],{"class":529},[499,888,889,890,893,894,896,897,899,900,902,903,905],{},"A level is enabled together with ",[503,891,892],{},"every coarser level"," — turning on ",[516,895,807],{}," also emits ",[516,898,675],{},", ",[516,901,768],{},", and\n",[516,904,758],{},". The finest enabled level sets the threshold.",[724,907,909,910],{"id":908},"bind-request-context-with-child","Bind request context with ",[516,911,912],{},"child",[499,914,915,916,919],{},"A request handler often wants the same correlating fields — a method, a path, a request id — on every line it\nwrites. ",[516,917,918],{},"logger.child(fields)"," returns a new logger that merges those fields into every record it emits, so you\nbind them once instead of passing them to each call:",[508,921,924],{"className":510,"code":922,"filename":923,"language":513,"meta":514,"style":514},"import { type HttpAction, type Middleware, type Next } from \"@heximon\u002Fhttp\";\nimport { Logger } from \"@heximon\u002Fruntime\";\n\nexport class RequestLogMiddleware implements Middleware {\n  private static readonly logger: Logger = new Logger(\"RequestLogMiddleware\");\n\n  public async handle(action: HttpAction, next: Next): Promise\u003CResponse> {\n    const { method, url } = action.request;\n    const visibility = action.scopes.includes(\"public\") ? \"public\" : \"guarded\";\n\n    RequestLogMiddleware.logger\n      .child({ method, path: new URL(url).pathname, visibility })\n      .log(\"request\");\n\n    return next();\n  }\n}\n","src\u002Frequest-log.middleware.ts",[516,925,926,965,985,989,1005,1039,1043,1083,1112,1166,1170,1181,1229,1248,1253,1266,1271],{"__ignoreMap":514},[519,927,928,930,932,935,938,940,942,945,947,949,952,954,956,958,961,963],{"class":521,"line":522},[519,929,526],{"class":525},[519,931,530],{"class":529},[519,933,934],{"class":525}," type",[519,936,937],{"class":533}," HttpAction",[519,939,848],{"class":529},[519,941,934],{"class":525},[519,943,944],{"class":533}," Middleware",[519,946,848],{"class":529},[519,948,934],{"class":525},[519,950,951],{"class":533}," Next",[519,953,537],{"class":529},[519,955,540],{"class":525},[519,957,543],{"class":529},[519,959,960],{"class":546},"@heximon\u002Fhttp",[519,962,550],{"class":529},[519,964,553],{"class":529},[519,966,967,969,971,973,975,977,979,981,983],{"class":521,"line":556},[519,968,526],{"class":525},[519,970,530],{"class":529},[519,972,534],{"class":533},[519,974,537],{"class":529},[519,976,540],{"class":525},[519,978,543],{"class":529},[519,980,547],{"class":546},[519,982,550],{"class":529},[519,984,553],{"class":529},[519,986,987],{"class":521,"line":563},[519,988,560],{"emptyLinePlaceholder":559},[519,990,991,993,995,998,1001,1003],{"class":521,"line":580},[519,992,566],{"class":525},[519,994,570],{"class":569},[519,996,997],{"class":573}," RequestLogMiddleware",[519,999,1000],{"class":569}," implements",[519,1002,944],{"class":573},[519,1004,577],{"class":529},[519,1006,1007,1009,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030,1033,1035,1037],{"class":521,"line":616},[519,1008,583],{"class":569},[519,1010,1011],{"class":569}," static",[519,1013,586],{"class":569},[519,1015,590],{"class":589},[519,1017,639],{"class":529},[519,1019,534],{"class":573},[519,1021,593],{"class":529},[519,1023,596],{"class":529},[519,1025,534],{"class":589},[519,1027,601],{"class":533},[519,1029,550],{"class":529},[519,1031,1032],{"class":546},"RequestLogMiddleware",[519,1034,550],{"class":529},[519,1036,611],{"class":533},[519,1038,553],{"class":529},[519,1040,1041],{"class":521,"line":621},[519,1042,560],{"emptyLinePlaceholder":559},[519,1044,1045,1047,1049,1052,1054,1057,1059,1061,1063,1066,1068,1070,1072,1074,1076,1079,1081],{"class":521,"line":662},[519,1046,624],{"class":569},[519,1048,627],{"class":569},[519,1050,1051],{"class":589}," handle",[519,1053,601],{"class":529},[519,1055,1056],{"class":635},"action",[519,1058,639],{"class":529},[519,1060,937],{"class":573},[519,1062,848],{"class":529},[519,1064,1065],{"class":635}," next",[519,1067,639],{"class":529},[519,1069,951],{"class":573},[519,1071,645],{"class":529},[519,1073,648],{"class":573},[519,1075,651],{"class":529},[519,1077,1078],{"class":573},"Response",[519,1080,657],{"class":529},[519,1082,577],{"class":529},[519,1084,1085,1088,1090,1093,1095,1098,1100,1102,1105,1107,1110],{"class":521,"line":691},[519,1086,1087],{"class":569},"    const",[519,1089,530],{"class":529},[519,1091,1092],{"class":533}," method",[519,1094,848],{"class":529},[519,1096,1097],{"class":533}," url",[519,1099,537],{"class":529},[519,1101,593],{"class":529},[519,1103,1104],{"class":533}," action",[519,1106,671],{"class":529},[519,1108,1109],{"class":533},"request",[519,1111,553],{"class":529},[519,1113,1114,1116,1119,1121,1123,1125,1128,1130,1133,1135,1137,1140,1142,1145,1148,1150,1152,1154,1157,1159,1162,1164],{"class":521,"line":698},[519,1115,1087],{"class":569},[519,1117,1118],{"class":533}," visibility",[519,1120,593],{"class":529},[519,1122,1104],{"class":533},[519,1124,671],{"class":529},[519,1126,1127],{"class":533},"scopes",[519,1129,671],{"class":529},[519,1131,1132],{"class":674},"includes",[519,1134,601],{"class":589},[519,1136,550],{"class":529},[519,1138,1139],{"class":546},"public",[519,1141,550],{"class":529},[519,1143,1144],{"class":589},") ",[519,1146,1147],{"class":529},"?",[519,1149,543],{"class":529},[519,1151,1139],{"class":546},[519,1153,550],{"class":529},[519,1155,1156],{"class":529}," :",[519,1158,543],{"class":529},[519,1160,1161],{"class":546},"guarded",[519,1163,550],{"class":529},[519,1165,553],{"class":529},[519,1167,1168],{"class":521,"line":704},[519,1169,560],{"emptyLinePlaceholder":559},[519,1171,1173,1176,1178],{"class":521,"line":1172},11,[519,1174,1175],{"class":533},"    RequestLogMiddleware",[519,1177,671],{"class":529},[519,1179,1180],{"class":533},"logger\n",[519,1182,1184,1187,1189,1191,1194,1196,1198,1201,1203,1205,1208,1210,1213,1215,1217,1220,1222,1224,1226],{"class":521,"line":1183},12,[519,1185,1186],{"class":529},"      .",[519,1188,912],{"class":674},[519,1190,601],{"class":589},[519,1192,1193],{"class":529},"{",[519,1195,1092],{"class":533},[519,1197,848],{"class":529},[519,1199,1200],{"class":589}," path",[519,1202,639],{"class":529},[519,1204,596],{"class":529},[519,1206,1207],{"class":674}," URL",[519,1209,601],{"class":589},[519,1211,1212],{"class":533},"url",[519,1214,611],{"class":589},[519,1216,671],{"class":529},[519,1218,1219],{"class":533},"pathname",[519,1221,848],{"class":529},[519,1223,1118],{"class":533},[519,1225,537],{"class":529},[519,1227,1228],{"class":589},")\n",[519,1230,1232,1234,1236,1238,1240,1242,1244,1246],{"class":521,"line":1231},13,[519,1233,1186],{"class":529},[519,1235,675],{"class":674},[519,1237,601],{"class":589},[519,1239,550],{"class":529},[519,1241,1109],{"class":546},[519,1243,550],{"class":529},[519,1245,611],{"class":589},[519,1247,553],{"class":529},[519,1249,1251],{"class":521,"line":1250},14,[519,1252,560],{"emptyLinePlaceholder":559},[519,1254,1256,1259,1261,1264],{"class":521,"line":1255},15,[519,1257,1258],{"class":525},"    return",[519,1260,1065],{"class":674},[519,1262,1263],{"class":589},"()",[519,1265,553],{"class":529},[519,1267,1269],{"class":521,"line":1268},16,[519,1270,701],{"class":529},[519,1272,1274],{"class":521,"line":1273},17,[519,1275,707],{"class":529},[499,1277,1278,1279,1282],{},"On the pretty (terminal) reporter the bound fields render as a dim ",[516,1280,1281],{},"key=value"," continuation line beneath the\nmessage:",[508,1284,1287],{"className":1285,"code":1286,"language":720,"meta":514},[718],"[RequestLogMiddleware] request\n      method=GET  path=\u002Fusers  visibility=guarded\n",[516,1288,1286],{"__ignoreMap":514},[499,1290,1291,1292,1295],{},"The merge is cumulative — ",[516,1293,1294],{},"logger.child({ a }).child({ b })"," binds both — and the nearer child wins a key clash,\nso a request-scoped child can layer onto a service-scoped one.",[724,1297,1299],{"id":1298},"set-the-level-and-output-shape","Set the level and output shape",[499,1301,1302,1303,1306,1307,1310],{},"The active level and reporter are process-wide. Set both once with ",[516,1304,1305],{},"Logger.configure(...)","; every logger,\n",[503,1308,1309],{},"including ones constructed before the call",", picks up the new settings on its next emit, so the order of\nconstruction never matters.",[508,1312,1314],{"className":510,"code":1313,"language":513,"meta":514,"style":514},"import { Logger, LoggerReporter } from \"@heximon\u002Fruntime\";\n\nLogger.configure({ level: { debug: true }, reporter: LoggerReporter.Json });\n",[516,1315,1316,1341,1345],{"__ignoreMap":514},[519,1317,1318,1320,1322,1324,1326,1329,1331,1333,1335,1337,1339],{"class":521,"line":522},[519,1319,526],{"class":525},[519,1321,530],{"class":529},[519,1323,534],{"class":533},[519,1325,848],{"class":529},[519,1327,1328],{"class":533}," LoggerReporter",[519,1330,537],{"class":529},[519,1332,540],{"class":525},[519,1334,543],{"class":529},[519,1336,547],{"class":546},[519,1338,550],{"class":529},[519,1340,553],{"class":529},[519,1342,1343],{"class":521,"line":556},[519,1344,560],{"emptyLinePlaceholder":559},[519,1346,1347,1350,1352,1355,1357,1359,1362,1364,1366,1369,1371,1375,1378,1381,1383,1385,1387,1390,1392,1394],{"class":521,"line":563},[519,1348,1349],{"class":533},"Logger",[519,1351,671],{"class":529},[519,1353,1354],{"class":674},"configure",[519,1356,601],{"class":533},[519,1358,1193],{"class":529},[519,1360,1361],{"class":589}," level",[519,1363,639],{"class":529},[519,1365,530],{"class":529},[519,1367,1368],{"class":589}," debug",[519,1370,639],{"class":529},[519,1372,1374],{"class":1373},"sfNiH"," true",[519,1376,1377],{"class":529}," },",[519,1379,1380],{"class":589}," reporter",[519,1382,639],{"class":529},[519,1384,1328],{"class":533},[519,1386,671],{"class":529},[519,1388,1389],{"class":533},"Json ",[519,1391,856],{"class":529},[519,1393,611],{"class":533},[519,1395,553],{"class":529},[499,1397,1398,1401,1402,1405,1406,1409,1410,1413],{},[516,1399,1400],{},"level"," is a set of booleans (",[516,1403,1404],{},"{ debug: true }"," enables debug and coarser; ",[516,1407,1408],{},"{ verbose: true }"," enables\neverything). ",[516,1411,1412],{},"reporter"," selects the output shape:",[732,1415,1416,1429],{},[735,1417,1418],{},[738,1419,1420,1423,1426],{},[741,1421,1422],{"align":743},"Reporter",[741,1424,1425],{"align":743},"Value",[741,1427,1428],{"align":743},"Output",[749,1430,1431,1444],{},[738,1432,1433,1436,1441],{},[754,1434,1435],{"align":743},"Pretty (default)",[754,1437,1438],{"align":743},[516,1439,1440],{},"LoggerReporter.Pretty",[754,1442,1443],{"align":743},"Human-readable terminal output, ANSI colors on a TTY.",[738,1445,1446,1449,1454],{},[754,1447,1448],{"align":743},"JSON",[754,1450,1451],{"align":743},[516,1452,1453],{},"LoggerReporter.Json",[754,1455,1456,1457,1460],{"align":743},"One JSON line per record (",[516,1458,1459],{},"{ level, time, msg, tag, …fields }","), Workers-safe.",[499,1462,1463,1464,1466,1467,1469,1470,1473,1474,1476],{},"With no configuration the level falls back to the platform default — ",[516,1465,807],{}," when the process is debugging,\ninformational ",[516,1468,675],{}," otherwise — and the reporter to pretty. Set ",[516,1471,1472],{},"HEXIMON_DEBUG=1"," in the environment to flip the\ndefault to ",[516,1475,807],{}," without writing any config:",[508,1478,1482],{"className":1479,"code":1480,"language":1481,"meta":514,"style":514},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","HEXIMON_DEBUG=1 pnpm dev\n","bash",[516,1483,1484],{"__ignoreMap":514},[519,1485,1486,1489,1492,1495,1498],{"class":521,"line":522},[519,1487,1488],{"class":533},"HEXIMON_DEBUG",[519,1490,1491],{"class":529},"=",[519,1493,1494],{"class":546},"1",[519,1496,1497],{"class":573}," pnpm",[519,1499,1500],{"class":546}," dev\n",[1502,1503,1505,1506,1509,1510,1513,1514,1517,1518,1521,1522,1524],"callout",{"type":1504},"info","You rarely call ",[516,1507,1508],{},"Logger.configure"," by hand. The generated boot wires it for you: when any class injects\n",[516,1511,1512],{},"CoreConfig",", the host reads ",[516,1515,1516],{},"CoreConfig.logger"," (a ",[516,1519,1520],{},"{ level?, reporter? }"," slot your app config layers in) and\ncalls ",[516,1523,1508],{}," once, right after the app is constructed.",[724,1526,1528],{"id":1527},"structured-json-in-production","Structured JSON in production",[499,1530,1531,1532,1534],{},"The JSON reporter emits one line per record with a fixed, aggregator-friendly shape — the level name, an ISO\ntimestamp, the rendered message, the tag, and any bound ",[516,1533,912],{}," fields flattened alongside:",[508,1536,1538],{"className":510,"code":1537,"language":513,"meta":514,"style":514},"Logger.configure({ reporter: LoggerReporter.Json });\nnew Logger(\"UsersService\").child({ requestId }).log(\"handling\");\n",[516,1539,1540,1568],{"__ignoreMap":514},[519,1541,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562,1564,1566],{"class":521,"line":522},[519,1543,1349],{"class":533},[519,1545,671],{"class":529},[519,1547,1354],{"class":674},[519,1549,601],{"class":533},[519,1551,1193],{"class":529},[519,1553,1380],{"class":589},[519,1555,639],{"class":529},[519,1557,1328],{"class":533},[519,1559,671],{"class":529},[519,1561,1389],{"class":533},[519,1563,856],{"class":529},[519,1565,611],{"class":533},[519,1567,553],{"class":529},[519,1569,1570,1573,1575,1577,1579,1581,1583,1585,1587,1589,1591,1593,1596,1598,1600,1602,1604,1606,1608,1611,1613,1615],{"class":521,"line":556},[519,1571,1572],{"class":529},"new",[519,1574,534],{"class":674},[519,1576,601],{"class":533},[519,1578,550],{"class":529},[519,1580,606],{"class":546},[519,1582,550],{"class":529},[519,1584,611],{"class":533},[519,1586,671],{"class":529},[519,1588,912],{"class":674},[519,1590,601],{"class":533},[519,1592,1193],{"class":529},[519,1594,1595],{"class":533}," requestId ",[519,1597,856],{"class":529},[519,1599,611],{"class":533},[519,1601,671],{"class":529},[519,1603,675],{"class":674},[519,1605,601],{"class":533},[519,1607,550],{"class":529},[519,1609,1610],{"class":546},"handling",[519,1612,550],{"class":529},[519,1614,611],{"class":533},[519,1616,553],{"class":529},[508,1618,1622],{"className":1619,"code":1620,"language":1621,"meta":514,"style":514},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"level\": \"log\", \"time\": \"2026-06-14T10:12:00.000Z\", \"msg\": \"handling\", \"tag\": \"UsersService\", \"requestId\": \"01J…\" }\n","json",[516,1623,1624],{"__ignoreMap":514},[519,1625,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1649,1651,1653,1655,1658,1660,1662,1664,1667,1669,1671,1673,1675,1677,1679,1681,1684,1686,1688,1690,1692,1694,1696,1698,1701,1703,1705,1707,1710,1712],{"class":521,"line":522},[519,1627,1193],{"class":529},[519,1629,543],{"class":529},[519,1631,1400],{"class":569},[519,1633,550],{"class":529},[519,1635,639],{"class":529},[519,1637,543],{"class":529},[519,1639,675],{"class":546},[519,1641,550],{"class":529},[519,1643,848],{"class":529},[519,1645,543],{"class":529},[519,1647,1648],{"class":569},"time",[519,1650,550],{"class":529},[519,1652,639],{"class":529},[519,1654,543],{"class":529},[519,1656,1657],{"class":546},"2026-06-14T10:12:00.000Z",[519,1659,550],{"class":529},[519,1661,848],{"class":529},[519,1663,543],{"class":529},[519,1665,1666],{"class":569},"msg",[519,1668,550],{"class":529},[519,1670,639],{"class":529},[519,1672,543],{"class":529},[519,1674,1610],{"class":546},[519,1676,550],{"class":529},[519,1678,848],{"class":529},[519,1680,543],{"class":529},[519,1682,1683],{"class":569},"tag",[519,1685,550],{"class":529},[519,1687,639],{"class":529},[519,1689,543],{"class":529},[519,1691,606],{"class":546},[519,1693,550],{"class":529},[519,1695,848],{"class":529},[519,1697,543],{"class":529},[519,1699,1700],{"class":569},"requestId",[519,1702,550],{"class":529},[519,1704,639],{"class":529},[519,1706,543],{"class":529},[519,1708,1709],{"class":546},"01J…",[519,1711,550],{"class":529},[519,1713,1714],{"class":529}," }\n",[499,1716,1717,1718,1721],{},"It uses only web APIs (no ",[516,1719,1720],{},"node:util","), so the same reporter runs unchanged on Node and on Cloudflare Workers,\nwhere pretty colors are disabled automatically.",[724,1723,1725],{"id":1724},"ship-logs-to-drains","Ship logs to drains",[499,1727,1728,1729,1732,1733,1739,1740,1746,1747,1749,1750,1753],{},"A ",[503,1730,1731],{},"drain"," is a sink every record is fanned to in addition to the console output — OTLP, Sentry, Axiom,\na file, your own backend. The ",[1734,1735,1736],"a",{"href":409},[516,1737,1738],{},"@heximon\u002Flogging"," package bridges\n",[1734,1741,1745],{"href":1742,"rel":1743},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog",[1744],"nofollow","evlog","'s drain catalog onto the ",[516,1748,1349],{},": add its compiler plugin and name\nthe drains you want in ",[516,1751,1752],{},"heximon.config.ts",". That block is the entire wiring — no application code:",[508,1755,1757],{"className":510,"code":1756,"filename":1752,"language":513,"meta":514,"style":514},"import { defineHeximonConfig } from \"@heximon\u002Fbuild\";\nimport { HttpPlugin } from \"@heximon\u002Fhttp\u002Fcompiler\";\nimport { LoggingPlugin } from \"@heximon\u002Flogging\u002Fcompiler\";\n\nexport default defineHeximonConfig({\n  plugins: [new HttpPlugin(), new LoggingPlugin()],\n  logging: {\n    service: \"orders-api\",\n    environment: \"development\",\n    drains: [\"memory\"], \u002F\u002F production: [\"otlp\", \"sentry\"] — each is zero-config via env vars\n    wideEvents: true,\n  },\n});\n",[516,1758,1759,1781,1803,1825,1829,1843,1871,1880,1896,1912,1936,1947,1952],{"__ignoreMap":514},[519,1760,1761,1763,1765,1768,1770,1772,1774,1777,1779],{"class":521,"line":522},[519,1762,526],{"class":525},[519,1764,530],{"class":529},[519,1766,1767],{"class":533}," defineHeximonConfig",[519,1769,537],{"class":529},[519,1771,540],{"class":525},[519,1773,543],{"class":529},[519,1775,1776],{"class":546},"@heximon\u002Fbuild",[519,1778,550],{"class":529},[519,1780,553],{"class":529},[519,1782,1783,1785,1787,1790,1792,1794,1796,1799,1801],{"class":521,"line":556},[519,1784,526],{"class":525},[519,1786,530],{"class":529},[519,1788,1789],{"class":533}," HttpPlugin",[519,1791,537],{"class":529},[519,1793,540],{"class":525},[519,1795,543],{"class":529},[519,1797,1798],{"class":546},"@heximon\u002Fhttp\u002Fcompiler",[519,1800,550],{"class":529},[519,1802,553],{"class":529},[519,1804,1805,1807,1809,1812,1814,1816,1818,1821,1823],{"class":521,"line":563},[519,1806,526],{"class":525},[519,1808,530],{"class":529},[519,1810,1811],{"class":533}," LoggingPlugin",[519,1813,537],{"class":529},[519,1815,540],{"class":525},[519,1817,543],{"class":529},[519,1819,1820],{"class":546},"@heximon\u002Flogging\u002Fcompiler",[519,1822,550],{"class":529},[519,1824,553],{"class":529},[519,1826,1827],{"class":521,"line":580},[519,1828,560],{"emptyLinePlaceholder":559},[519,1830,1831,1833,1836,1838,1840],{"class":521,"line":616},[519,1832,566],{"class":525},[519,1834,1835],{"class":525}," default",[519,1837,1767],{"class":674},[519,1839,601],{"class":533},[519,1841,1842],{"class":529},"{\n",[519,1844,1845,1848,1850,1853,1855,1857,1859,1861,1863,1865,1868],{"class":521,"line":621},[519,1846,1847],{"class":589},"  plugins",[519,1849,639],{"class":529},[519,1851,1852],{"class":533}," [",[519,1854,1572],{"class":529},[519,1856,1789],{"class":674},[519,1858,1263],{"class":533},[519,1860,848],{"class":529},[519,1862,596],{"class":529},[519,1864,1811],{"class":674},[519,1866,1867],{"class":533},"()]",[519,1869,1870],{"class":529},",\n",[519,1872,1873,1876,1878],{"class":521,"line":662},[519,1874,1875],{"class":589},"  logging",[519,1877,639],{"class":529},[519,1879,577],{"class":529},[519,1881,1882,1885,1887,1889,1892,1894],{"class":521,"line":691},[519,1883,1884],{"class":589},"    service",[519,1886,639],{"class":529},[519,1888,543],{"class":529},[519,1890,1891],{"class":546},"orders-api",[519,1893,550],{"class":529},[519,1895,1870],{"class":529},[519,1897,1898,1901,1903,1905,1908,1910],{"class":521,"line":698},[519,1899,1900],{"class":589},"    environment",[519,1902,639],{"class":529},[519,1904,543],{"class":529},[519,1906,1907],{"class":546},"development",[519,1909,550],{"class":529},[519,1911,1870],{"class":529},[519,1913,1914,1917,1919,1921,1923,1926,1928,1931,1933],{"class":521,"line":704},[519,1915,1916],{"class":589},"    drains",[519,1918,639],{"class":529},[519,1920,1852],{"class":533},[519,1922,550],{"class":529},[519,1924,1925],{"class":546},"memory",[519,1927,550],{"class":529},[519,1929,1930],{"class":533},"]",[519,1932,848],{"class":529},[519,1934,1935],{"class":694}," \u002F\u002F production: [\"otlp\", \"sentry\"] — each is zero-config via env vars\n",[519,1937,1938,1941,1943,1945],{"class":521,"line":1172},[519,1939,1940],{"class":589},"    wideEvents",[519,1942,639],{"class":529},[519,1944,1374],{"class":1373},[519,1946,1870],{"class":529},[519,1948,1949],{"class":521,"line":1183},[519,1950,1951],{"class":529},"  },\n",[519,1953,1954,1956,1958],{"class":521,"line":1231},[519,1955,856],{"class":529},[519,1957,611],{"class":533},[519,1959,553],{"class":529},[499,1961,1962,1963,899,1966,899,1969,899,1972,899,1975,899,1978,899,1981,899,1984,1987,1988,1990],{},"Built-in drain names — ",[516,1964,1965],{},"otlp",[516,1967,1968],{},"axiom",[516,1970,1971],{},"sentry",[516,1973,1974],{},"datadog",[516,1976,1977],{},"posthog",[516,1979,1980],{},"better-stack",[516,1982,1983],{},"hyperdx",[516,1985,1986],{},"fs","\n(Node-only), ",[516,1989,1925],{}," (tests) — each map to an evlog adapter and read their own environment variables, so most\nneed no options. The build pulls in only the drains you named.",[499,1992,1993,1994,1997,1998,2001,2002,2005,2006,639],{},"For a sink that needs an app-resolved dependency or a bespoke transport, implement the ",[516,1995,1996],{},"LogDrain"," interface\n(",[516,1999,2000],{},"emit(record)"," + optional ",[516,2003,2004],{},"flush()",") and register it with ",[516,2007,2008],{},"Logger.addDrain",[508,2010,2013],{"className":510,"code":2011,"filename":2012,"language":513,"meta":514,"style":514},"import { type LogDrain, type LogRecord, Logger, type OnBootstrap, type OnShutdown } from \"@heximon\u002Fruntime\";\n\nexport class CaptureDrain implements LogDrain, OnBootstrap, OnShutdown {\n  public readonly records: LogRecord[] = [];\n\n  public onBootstrap(): void {\n    Logger.addDrain(this);\n  }\n\n  public onShutdown(): void {\n    Logger.removeDrain(this);\n  }\n\n  public emit(record: LogRecord): void {\n    this.records.push(record); \u002F\u002F a real drain ships the record to your backend\n  }\n}\n","capture.drain.ts",[516,2014,2015,2063,2067,2090,2113,2117,2132,2151,2155,2159,2172,2189,2193,2197,2219,2243,2247],{"__ignoreMap":514},[519,2016,2017,2019,2021,2023,2026,2028,2030,2033,2035,2037,2039,2041,2044,2046,2048,2051,2053,2055,2057,2059,2061],{"class":521,"line":522},[519,2018,526],{"class":525},[519,2020,530],{"class":529},[519,2022,934],{"class":525},[519,2024,2025],{"class":533}," LogDrain",[519,2027,848],{"class":529},[519,2029,934],{"class":525},[519,2031,2032],{"class":533}," LogRecord",[519,2034,848],{"class":529},[519,2036,534],{"class":533},[519,2038,848],{"class":529},[519,2040,934],{"class":525},[519,2042,2043],{"class":533}," OnBootstrap",[519,2045,848],{"class":529},[519,2047,934],{"class":525},[519,2049,2050],{"class":533}," OnShutdown",[519,2052,537],{"class":529},[519,2054,540],{"class":525},[519,2056,543],{"class":529},[519,2058,547],{"class":546},[519,2060,550],{"class":529},[519,2062,553],{"class":529},[519,2064,2065],{"class":521,"line":556},[519,2066,560],{"emptyLinePlaceholder":559},[519,2068,2069,2071,2073,2076,2078,2080,2082,2084,2086,2088],{"class":521,"line":563},[519,2070,566],{"class":525},[519,2072,570],{"class":569},[519,2074,2075],{"class":573}," CaptureDrain",[519,2077,1000],{"class":569},[519,2079,2025],{"class":573},[519,2081,848],{"class":529},[519,2083,2043],{"class":573},[519,2085,848],{"class":529},[519,2087,2050],{"class":573},[519,2089,577],{"class":529},[519,2091,2092,2094,2096,2099,2101,2103,2106,2108,2111],{"class":521,"line":580},[519,2093,624],{"class":569},[519,2095,586],{"class":569},[519,2097,2098],{"class":589}," records",[519,2100,639],{"class":529},[519,2102,2032],{"class":573},[519,2104,2105],{"class":533},"[] ",[519,2107,1491],{"class":529},[519,2109,2110],{"class":533}," []",[519,2112,553],{"class":529},[519,2114,2115],{"class":521,"line":616},[519,2116,560],{"emptyLinePlaceholder":559},[519,2118,2119,2121,2124,2127,2130],{"class":521,"line":621},[519,2120,624],{"class":569},[519,2122,2123],{"class":589}," onBootstrap",[519,2125,2126],{"class":529},"():",[519,2128,2129],{"class":573}," void",[519,2131,577],{"class":529},[519,2133,2134,2137,2139,2142,2144,2147,2149],{"class":521,"line":662},[519,2135,2136],{"class":533},"    Logger",[519,2138,671],{"class":529},[519,2140,2141],{"class":674},"addDrain",[519,2143,601],{"class":589},[519,2145,2146],{"class":529},"this",[519,2148,611],{"class":589},[519,2150,553],{"class":529},[519,2152,2153],{"class":521,"line":691},[519,2154,701],{"class":529},[519,2156,2157],{"class":521,"line":698},[519,2158,560],{"emptyLinePlaceholder":559},[519,2160,2161,2163,2166,2168,2170],{"class":521,"line":704},[519,2162,624],{"class":569},[519,2164,2165],{"class":589}," onShutdown",[519,2167,2126],{"class":529},[519,2169,2129],{"class":573},[519,2171,577],{"class":529},[519,2173,2174,2176,2178,2181,2183,2185,2187],{"class":521,"line":1172},[519,2175,2136],{"class":533},[519,2177,671],{"class":529},[519,2179,2180],{"class":674},"removeDrain",[519,2182,601],{"class":589},[519,2184,2146],{"class":529},[519,2186,611],{"class":589},[519,2188,553],{"class":529},[519,2190,2191],{"class":521,"line":1183},[519,2192,701],{"class":529},[519,2194,2195],{"class":521,"line":1231},[519,2196,560],{"emptyLinePlaceholder":559},[519,2198,2199,2201,2204,2206,2209,2211,2213,2215,2217],{"class":521,"line":1250},[519,2200,624],{"class":569},[519,2202,2203],{"class":589}," emit",[519,2205,601],{"class":529},[519,2207,2208],{"class":635},"record",[519,2210,639],{"class":529},[519,2212,2032],{"class":573},[519,2214,645],{"class":529},[519,2216,2129],{"class":573},[519,2218,577],{"class":529},[519,2220,2221,2223,2226,2228,2231,2233,2235,2237,2240],{"class":521,"line":1255},[519,2222,665],{"class":529},[519,2224,2225],{"class":533},"records",[519,2227,671],{"class":529},[519,2229,2230],{"class":674},"push",[519,2232,601],{"class":589},[519,2234,2208],{"class":533},[519,2236,611],{"class":589},[519,2238,2239],{"class":529},";",[519,2241,2242],{"class":694}," \u002F\u002F a real drain ships the record to your backend\n",[519,2244,2245],{"class":521,"line":1268},[519,2246,701],{"class":529},[519,2248,2249],{"class":521,"line":1273},[519,2250,707],{"class":529},[499,2252,2253],{},"A drain failure never breaks a request or recurses — the fan-out is fire-and-forget and fault-isolated.",[724,2255,2257],{"id":2256},"wide-events","Wide events",[499,2259,1728,2260,2263,2264,2267,2268,639],{},[503,2261,2262],{},"wide event"," is one structured event per request, accumulated over its lifetime and emitted once at the\nend — the low-volume counterpart to per-line logs. Turn it on with ",[516,2265,2266],{},"wideEvents: true"," (above), then add\nrequest-scoped fields anywhere with ",[516,2269,2270],{},"logger.set(...)",[508,2272,2275],{"className":510,"code":2273,"filename":2274,"language":513,"meta":514,"style":514},"import { Logger } from \"@heximon\u002Fruntime\";\nimport { type Controller, type Get } from \"@heximon\u002Fhttp\";\n\nexport class OrdersController implements Controller\u003C\"\u002Forders\"> {\n  private readonly logger: Logger = new Logger(\"OrdersController\");\n\n  public list(_action: Get\u003C\"\u002F\">): { orders: string[] } {\n    const orders = [\"ORD-1\", \"ORD-2\"];\n\n    this.logger.set({ route: \"list\", resultCount: orders.length });\n    this.logger.log(\"listing orders\"); \u002F\u002F an ordinary line, still fanned to the drains\n\n    return { orders };\n  }\n}\n","orders.controller.ts",[516,2276,2277,2297,2327,2331,2357,2388,2392,2436,2466,2470,2517,2543,2547,2558,2562],{"__ignoreMap":514},[519,2278,2279,2281,2283,2285,2287,2289,2291,2293,2295],{"class":521,"line":522},[519,2280,526],{"class":525},[519,2282,530],{"class":529},[519,2284,534],{"class":533},[519,2286,537],{"class":529},[519,2288,540],{"class":525},[519,2290,543],{"class":529},[519,2292,547],{"class":546},[519,2294,550],{"class":529},[519,2296,553],{"class":529},[519,2298,2299,2301,2303,2305,2308,2310,2312,2315,2317,2319,2321,2323,2325],{"class":521,"line":556},[519,2300,526],{"class":525},[519,2302,530],{"class":529},[519,2304,934],{"class":525},[519,2306,2307],{"class":533}," Controller",[519,2309,848],{"class":529},[519,2311,934],{"class":525},[519,2313,2314],{"class":533}," Get",[519,2316,537],{"class":529},[519,2318,540],{"class":525},[519,2320,543],{"class":529},[519,2322,960],{"class":546},[519,2324,550],{"class":529},[519,2326,553],{"class":529},[519,2328,2329],{"class":521,"line":563},[519,2330,560],{"emptyLinePlaceholder":559},[519,2332,2333,2335,2337,2340,2342,2344,2346,2348,2351,2353,2355],{"class":521,"line":580},[519,2334,566],{"class":525},[519,2336,570],{"class":569},[519,2338,2339],{"class":573}," OrdersController",[519,2341,1000],{"class":569},[519,2343,2307],{"class":573},[519,2345,651],{"class":529},[519,2347,550],{"class":529},[519,2349,2350],{"class":546},"\u002Forders",[519,2352,550],{"class":529},[519,2354,657],{"class":529},[519,2356,577],{"class":529},[519,2358,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2382,2384,2386],{"class":521,"line":616},[519,2360,583],{"class":569},[519,2362,586],{"class":569},[519,2364,590],{"class":589},[519,2366,639],{"class":529},[519,2368,534],{"class":573},[519,2370,593],{"class":529},[519,2372,596],{"class":529},[519,2374,534],{"class":589},[519,2376,601],{"class":533},[519,2378,550],{"class":529},[519,2380,2381],{"class":546},"OrdersController",[519,2383,550],{"class":529},[519,2385,611],{"class":533},[519,2387,553],{"class":529},[519,2389,2390],{"class":521,"line":621},[519,2391,560],{"emptyLinePlaceholder":559},[519,2393,2394,2396,2399,2401,2404,2406,2408,2410,2412,2415,2417,2420,2422,2425,2427,2430,2432,2434],{"class":521,"line":662},[519,2395,624],{"class":569},[519,2397,2398],{"class":589}," list",[519,2400,601],{"class":529},[519,2402,2403],{"class":635},"_action",[519,2405,639],{"class":529},[519,2407,2314],{"class":573},[519,2409,651],{"class":529},[519,2411,550],{"class":529},[519,2413,2414],{"class":546},"\u002F",[519,2416,550],{"class":529},[519,2418,2419],{"class":529},">):",[519,2421,530],{"class":529},[519,2423,2424],{"class":589}," orders",[519,2426,639],{"class":529},[519,2428,2429],{"class":573}," string",[519,2431,2105],{"class":533},[519,2433,856],{"class":529},[519,2435,577],{"class":529},[519,2437,2438,2440,2442,2444,2446,2448,2451,2453,2455,2457,2460,2462,2464],{"class":521,"line":691},[519,2439,1087],{"class":569},[519,2441,2424],{"class":533},[519,2443,593],{"class":529},[519,2445,1852],{"class":589},[519,2447,550],{"class":529},[519,2449,2450],{"class":546},"ORD-1",[519,2452,550],{"class":529},[519,2454,848],{"class":529},[519,2456,543],{"class":529},[519,2458,2459],{"class":546},"ORD-2",[519,2461,550],{"class":529},[519,2463,1930],{"class":589},[519,2465,553],{"class":529},[519,2467,2468],{"class":521,"line":698},[519,2469,560],{"emptyLinePlaceholder":559},[519,2471,2472,2474,2476,2478,2481,2483,2485,2488,2490,2492,2495,2497,2499,2502,2504,2506,2508,2511,2513,2515],{"class":521,"line":704},[519,2473,665],{"class":529},[519,2475,668],{"class":533},[519,2477,671],{"class":529},[519,2479,2480],{"class":674},"set",[519,2482,601],{"class":589},[519,2484,1193],{"class":529},[519,2486,2487],{"class":589}," route",[519,2489,639],{"class":529},[519,2491,543],{"class":529},[519,2493,2494],{"class":546},"list",[519,2496,550],{"class":529},[519,2498,848],{"class":529},[519,2500,2501],{"class":589}," resultCount",[519,2503,639],{"class":529},[519,2505,2424],{"class":533},[519,2507,671],{"class":529},[519,2509,2510],{"class":533},"length",[519,2512,537],{"class":529},[519,2514,611],{"class":589},[519,2516,553],{"class":529},[519,2518,2519,2521,2523,2525,2527,2529,2531,2534,2536,2538,2540],{"class":521,"line":1172},[519,2520,665],{"class":529},[519,2522,668],{"class":533},[519,2524,671],{"class":529},[519,2526,675],{"class":674},[519,2528,601],{"class":589},[519,2530,550],{"class":529},[519,2532,2533],{"class":546},"listing orders",[519,2535,550],{"class":529},[519,2537,611],{"class":589},[519,2539,2239],{"class":529},[519,2541,2542],{"class":694}," \u002F\u002F an ordinary line, still fanned to the drains\n",[519,2544,2545],{"class":521,"line":1183},[519,2546,560],{"emptyLinePlaceholder":559},[519,2548,2549,2551,2553,2555],{"class":521,"line":1231},[519,2550,1258],{"class":525},[519,2552,530],{"class":529},[519,2554,2424],{"class":533},[519,2556,2557],{"class":529}," };\n",[519,2559,2560],{"class":521,"line":1250},[519,2561,701],{"class":529},[519,2563,2564],{"class":521,"line":1255},[519,2565,707],{"class":529},[499,2567,2568,2570,2571,2574],{},[516,2569,2480],{}," is ",[503,2572,2573],{},"ambient"," — it writes the accumulator opened for the active request, so any service \u002F command \u002F\nevent handler called inside the request contributes fields with no threading, and it is a safe no-op outside a\nrequest.",[499,2576,2577,2578,2581,2582,899,2585,899,2588,2591,2592,2594,2595,2598,2599,2602],{},"At request end one event is fanned to the drains carrying the set fields plus ",[516,2579,2580],{},"method",", the request\n",[516,2583,2584],{},"path",[516,2586,2587],{},"status",[516,2589,2590],{},"durationMs",", and ",[516,2593,1700],{},"; its level is derived from the status (",[516,2596,2597],{},"5xx"," → error, ",[516,2600,2601],{},"4xx"," →\nwarn, else info).",[724,2604,2606],{"id":2605},"the-startup-summary","The startup summary",[499,2608,2609,2610,2612],{},"The generated server logs two green-",[516,2611,784],{}," success lines the moment it finishes building — one for the DI graph\n(module + provider counts), one for the HTTP layer (controller count) — each with how long that span took:",[508,2614,2617],{"className":2615,"code":2616,"language":720,"meta":514},[718],"✔ Heximon app started in 0.13ms (2 modules · 1 provider)\n✔ Heximon server started in 0.67ms (1 controller)\n",[516,2618,2616],{"__ignoreMap":514},[499,2620,2621,2622,2625,2626,2629],{},"Under ",[516,2623,2624],{},"pnpm dev"," the Vite host prints a matching ",[516,2627,2628],{},"compiled"," line at build time, so the three read as one\nstartup sequence:",[508,2631,2634],{"className":2632,"code":2633,"language":720,"meta":514},[718],"✔ Heximon compiled in 44ms\n✔ Heximon app started in 0.13ms (2 modules · 1 provider)\n✔ Heximon server started in 0.67ms (1 controller)\n",[516,2635,2633],{"__ignoreMap":514},[499,2637,2638,2639,2641,2642,2644,2645,2414,2647,2649,2650,2653,2654,2657,2658,2661],{},"The lines are on by default, emitted at the informational ",[516,2640,675],{}," visibility with consola's green ",[516,2643,784],{}," success\nstyling — so they appear under the default level and a quieter level (",[516,2646,768],{},[516,2648,758],{},") suppresses them, the same\nas any other line. The counts are fixed at compile time; each elapsed span is measured at boot and formatted\nsub-millisecond-aware (a sub-",[516,2651,2652],{},"1ms"," span keeps two decimals, so a fast boot reads as ",[516,2655,2656],{},"0.13ms",", not ",[516,2659,2660],{},"0ms",").",[499,2663,2664,2665,2667,2668,2670,2671,2674],{},"The\ntwo runtime lines work the same under Node, Nitro, and the edge; the ",[516,2666,2628],{}," line is the dev\u002Fbuild host's, so\nit appears under ",[516,2669,2624],{}," (and a bare ",[516,2672,2673],{},"vite build","), not in a production runtime.",[724,2676,2678],{"id":2677},"see-also","See also",[2680,2681,2682,2693,2698,2703,2717],"ul",{},[2683,2684,2685,2688,2689,2692],"li",{},[1734,2686,2687],{"href":127},"Request Context"," — read the correlation id off the ambient ",[516,2690,2691],{},"Context"," to bind onto a child logger.",[2683,2694,2695,2697],{},[1734,2696,394],{"href":395}," — the other half of what you see in the terminal: how a\nbuild error points at the offending line.",[2683,2699,2700,2702],{},[1734,2701,106],{"href":107}," — turn a thrown error into a clean response instead of a log-and-500.",[2683,2704,2705,2710,2711,2713,2714,2716],{},[1734,2706,2709],{"href":2707,"rel":2708},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fladder\u002FL01-minimal",[1744],"the ladder's L01 — Minimal"," — the\n",[516,2712,1032],{}," above, logging a ",[516,2715,912],{},"-bound line per request.",[2683,2718,2719,2726,2727,2729],{},[1734,2720,2723],{"href":2721,"rel":2722},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fflagship\u002Fapps\u002Fmonolith",[1744],[503,2724,2725],{},"The flagship monolith"," — declarative\ndrains + wide events composed alongside the app's OTel \u002F health \u002F cache \u002F saga \u002F workflow legs; its logging e2e\nregisters a custom ",[516,2728,1996],{}," and asserts the one wide event a request produces.",[2731,2732,2733],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":514,"searchDepth":556,"depth":556,"links":2735},[2736,2737,2739,2740,2741,2742,2743,2744],{"id":726,"depth":556,"text":727},{"id":908,"depth":556,"text":2738},"Bind request context with child",{"id":1298,"depth":556,"text":1299},{"id":1527,"depth":556,"text":1528},{"id":1724,"depth":556,"text":1725},{"id":2256,"depth":556,"text":2257},{"id":2605,"depth":556,"text":2606},{"id":2677,"depth":556,"text":2678},"Logger, child fields, Logger.configure, LoggerReporter pretty and json, log levels, HEXIMON_DEBUG, shipping logs to drains, opt-in wide events, and the startup summary lines.","md",null,{},{"icon":124},{"title":121,"description":2745},"NWsoxmj1JYYG8gL3S57KTcIrV_c1IQOTX1uTa3HWI2o",[2753,2755],{"title":116,"path":117,"stem":118,"description":2754,"icon":119,"children":-1},"createTestApp, TestApp, TestAppOptions, createTestClient, eagerInit, context.run, provider overrides, database isolation, contract-mode registration, multi-app isolation, heximon.config.ts plugin precedence",{"title":126,"path":127,"stem":128,"description":2756,"icon":129,"children":-1},"Request-scoped data with Context and the augmentable ContextData, deferred work via waitUntil and background, plus the OnInit, OnBootstrap, and OnShutdown lifecycle hooks, createApp, get, preload, and graceful shutdown with drain.",1783300761903]