[{"data":1,"prerenderedAt":488},["ShallowReactive",2],{"navigation_docs":3,"-guide-mails":168,"-guide-mails-surround":483},[4,146],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Guide","i-lucide-book-open","\u002Fguide","1.guide",[10,14,37,55,59,63,67,71,75,79,83,87,109,134,138,142],{"title":11,"path":12,"stem":13},"What is Agent Zero?","\u002Fguide\u002Fintroduction","1.guide\u002F1.introduction",{"title":15,"icon":16,"path":17,"stem":18,"children":19,"page":36},"API","i-lucide-plug","\u002Fguide\u002Fapi","1.guide\u002F10.api",[20,24,28,32],{"title":21,"path":22,"stem":23},"API overview","\u002Fguide\u002Fapi\u002Foverview","1.guide\u002F10.api\u002F1.overview",{"title":25,"path":26,"stem":27},"Define endpoints","\u002Fguide\u002Fapi\u002Fdefine-endpoints","1.guide\u002F10.api\u002F2.define-endpoints",{"title":29,"path":30,"stem":31},"Use the API from a client","\u002Fguide\u002Fapi\u002Fuse-from-client","1.guide\u002F10.api\u002F3.use-from-client",{"title":33,"path":34,"stem":35},"Protect endpoints","\u002Fguide\u002Fapi\u002Fprotect-endpoints","1.guide\u002F10.api\u002F4.protect-endpoints",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Authentication","i-lucide-lock","\u002Fguide\u002Fauthentication","1.guide\u002F11.authentication",[43,47,51],{"title":44,"path":45,"stem":46},"Authentication overview","\u002Fguide\u002Fauthentication\u002Foverview","1.guide\u002F11.authentication\u002F1.overview",{"title":48,"path":49,"stem":50},"GitHub OAuth","\u002Fguide\u002Fauthentication\u002Foauth","1.guide\u002F11.authentication\u002F2.oauth",{"title":52,"path":53,"stem":54},"Permissions","\u002Fguide\u002Fauthentication\u002Fpermissions","1.guide\u002F11.authentication\u002F3.permissions",{"title":56,"path":57,"stem":58},"Organizations","\u002Fguide\u002Forganizations","1.guide\u002F12.organizations",{"title":60,"path":61,"stem":62},"Frontend","\u002Fguide\u002Ffrontend","1.guide\u002F13.frontend",{"title":64,"path":65,"stem":66},"Mails","\u002Fguide\u002Fmails","1.guide\u002F14.mails",{"title":68,"path":69,"stem":70},"Internationalization","\u002Fguide\u002Finternationalization","1.guide\u002F15.internationalization",{"title":72,"path":73,"stem":74},"Deployment","\u002Fguide\u002Fdeployment","1.guide\u002F16.deployment",{"title":76,"path":77,"stem":78},"Tech stack","\u002Fguide\u002Ftech-stack","1.guide\u002F2.tech-stack",{"title":80,"path":81,"stem":82},"Installation","\u002Fguide\u002Finstallation","1.guide\u002F3.installation",{"title":84,"path":85,"stem":86},"Environment variables","\u002Fguide\u002Fenvironment-variables","1.guide\u002F4.environment-variables",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":36},"Codebase","i-lucide-folder-tree","\u002Fguide\u002Fcodebase","1.guide\u002F5.codebase",[93,97,101,105],{"title":94,"path":95,"stem":96},"Codebase structure","\u002Fguide\u002Fcodebase\u002Fstructure","1.guide\u002F5.codebase\u002F1.structure",{"title":98,"path":99,"stem":100},"Dependencies","\u002Fguide\u002Fcodebase\u002Fdependencies","1.guide\u002F5.codebase\u002F2.dependencies",{"title":102,"path":103,"stem":104},"Formatting and linting","\u002Fguide\u002Fcodebase\u002Fformatting-linting","1.guide\u002F5.codebase\u002F3.formatting-linting",{"title":106,"path":107,"stem":108},"Agent Skills","\u002Fguide\u002Fcodebase\u002Fagent-skills","1.guide\u002F5.codebase\u002F4.agent-skills",{"title":110,"icon":111,"path":112,"stem":113,"children":114,"page":36},"Architecture","i-lucide-layers","\u002Fguide\u002Farchitecture","1.guide\u002F6.architecture",[115,118,122,126,130],{"title":110,"path":116,"stem":117},"\u002Fguide\u002Farchitecture\u002Foverview","1.guide\u002F6.architecture\u002F1.overview",{"title":119,"path":120,"stem":121},"State machine","\u002Fguide\u002Farchitecture\u002Fstate-machine","1.guide\u002F6.architecture\u002F2.state-machine",{"title":123,"path":124,"stem":125},"Execution boundary","\u002Fguide\u002Farchitecture\u002Fexecution-boundary","1.guide\u002F6.architecture\u002F3.execution-boundary",{"title":127,"path":128,"stem":129},"Issue-to-PR workflow","\u002Fguide\u002Farchitecture\u002Fissue-to-pr","1.guide\u002F6.architecture\u002F4.issue-to-pr",{"title":131,"path":132,"stem":133},"Adding a capability","\u002Fguide\u002Farchitecture\u002Fadding-a-capability","1.guide\u002F6.architecture\u002F5.adding-a-capability",{"title":135,"path":136,"stem":137},"Repository policy","\u002Fguide\u002Fconfiguration","1.guide\u002F7.configuration",{"title":139,"path":140,"stem":141},"Safety model","\u002Fguide\u002Fsafety","1.guide\u002F8.safety",{"title":143,"path":144,"stem":145},"Database","\u002Fguide\u002Fdatabase","1.guide\u002F9.database",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":36},"Reference","i-lucide-book-marked","\u002Freference","2.reference",[152,156,160,164],{"title":153,"path":154,"stem":155},"CLI","\u002Freference\u002Fcli","2.reference\u002F1.cli",{"title":157,"path":158,"stem":159},"Model providers","\u002Freference\u002Fmodel-providers","2.reference\u002F2.model-providers",{"title":161,"path":162,"stem":163},"Source-control providers","\u002Freference\u002Fsource-control-providers","2.reference\u002F3.source-control-providers",{"title":165,"path":166,"stem":167},"Sandbox providers","\u002Freference\u002Fsandbox-providers","2.reference\u002F4.sandbox-providers",{"id":169,"title":64,"body":170,"description":476,"extension":477,"links":478,"meta":479,"navigation":480,"path":65,"seo":481,"stem":66,"__hash__":482},"docs\u002F1.guide\u002F14.mails.md",{"type":171,"value":172,"toc":469},"minimark",[173,189,194,211,276,282,295,299,302,332,335,339,342,367,382,393,397,403,417,443,465],[174,175,176,180,181,188],"p",{},[177,178,179],"code",{},"packages\u002Fmail"," owns transactional email: ",[182,183,187],"a",{"href":184,"rel":185},"https:\u002F\u002Fmaizzle.com",[186],"nofollow","Maizzle","-based templates plus a small provider layer. The dashboard uses it for organization invitations and other auth-driven messages.",[190,191,193],"h2",{"id":192},"providers","Providers",[174,195,196,199,200,203,204,207,208,210],{},[177,197,198],{},"MAIL_PROVIDER"," selects the transport. When it is absent, a configured ",[177,201,202],{},"RESEND_API_KEY"," selects Resend so hosted integrations such as Vercel's work without a second selector variable. With neither set, the default is ",[177,205,206],{},"console",", which logs instead of delivering — an unconfigured deployment cannot silently attempt real delivery. An explicit ",[177,209,198],{}," always wins.",[212,213,214,227],"table",{},[215,216,217],"thead",{},[218,219,220,224],"tr",{},[221,222,223],"th",{},"Provider",[221,225,226],{},"Configuration",[228,229,230,240,251],"tbody",{},[218,231,232,237],{},[233,234,235],"td",{},[177,236,206],{},[233,238,239],{},"None. Logs the rendered message. The credential-free default; not for production.",[218,241,242,247],{},[233,243,244],{},[177,245,246],{},"resend",[233,248,249],{},[177,250,202],{},[218,252,253,258],{},[233,254,255],{},[177,256,257],{},"smtp",[233,259,260,263,264,263,267,263,270,263,273],{},[177,261,262],{},"SMTP_HOST",", ",[177,265,266],{},"SMTP_PORT",[177,268,269],{},"SMTP_USER",[177,271,272],{},"SMTP_PASSWORD",[177,274,275],{},"SMTP_SECURE",[174,277,278,281],{},[177,279,280],{},"MAIL_FROM"," sets the sender address for every provider.",[174,283,284,286,287,290,291,294],{},[177,285,275],{}," selects implicit TLS: ",[177,288,289],{},"true"," on port 465, ",[177,292,293],{},"false"," on port 587 (STARTTLS).",[190,296,298],{"id":297},"templates","Templates",[174,300,301],{},"Templates are authored with Maizzle and declared in the package's template registry:",[303,304,305,316,322],"ul",{},[306,307,308,311,312,315],"li",{},[177,309,310],{},"mailTemplates"," maps a ",[177,313,314],{},"MailTemplateId"," to its template file, subject, and context fields;",[306,317,318,321],{},[177,319,320],{},"MailTemplateContext"," types the data each template needs;",[306,323,324,327,328,331],{},[177,325,326],{},"maizzle.config.ts"," is discovered by Maizzle's own ",[177,329,330],{},"render()"," call by filesystem convention.",[174,333,334],{},"Adding a template means adding it to the registry with a typed context, keeping delivery and content concerns separate: providers never know what a template says, and templates never know how mail is sent.",[190,336,338],{"id":337},"compiling-templates","Compiling templates",[174,340,341],{},"Rendering a template runs Maizzle's pipeline — Vue SSR, CSS inlining, plaintext — on top of a Vite SSR server, which needs a bundler with its platform-native binary and a writable working directory. The deployments that send mail are serverless functions with neither, so rendering happens once at build time instead:",[343,344,349],"pre",{"className":345,"code":346,"language":347,"meta":348,"style":348},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","aube run mail:compile\n","bash","",[177,350,351],{"__ignoreMap":348},[352,353,356,360,364],"span",{"class":354,"line":355},"line",1,[352,357,359],{"class":358},"sBMFI","aube",[352,361,363],{"class":362},"sfazB"," run",[352,365,366],{"class":362}," mail:compile\n",[174,368,369,370,373,374,377,378,381],{},"That writes ",[177,371,372],{},"packages\u002Fmail\u002Fsrc\u002Futil\u002Fcompiled-templates.json",", which is checked in and bundled into the package. Each template is rendered once per combination of the ",[177,375,376],{},"conditional"," fields the registry declares — the halves a template renders away when empty — with every other field standing in as a placeholder. ",[177,379,380],{},"sendEmail"," then picks the variant its context matches and substitutes the values, escaping them for the HTML part and leaving them bare in the plaintext one.",[174,383,384,385,388,389,392],{},"Run it after editing anything under ",[177,386,387],{},"packages\u002Fmail\u002Femails\u002F",". ",[177,390,391],{},"aube test"," fails when the checked-in artifact no longer matches what the templates render.",[190,394,396],{"id":395},"previewing-templates","Previewing templates",[174,398,399,402],{},[177,400,401],{},"apps\u002Fmail-preview"," wraps Maizzle's dev server around the package's templates:",[343,404,406],{"className":345,"code":405,"language":347,"meta":348,"style":348},"aube run mail:preview\n",[177,407,408],{"__ignoreMap":348},[352,409,410,412,414],{"class":354,"line":355},[352,411,359],{"class":358},[352,413,363],{"class":362},[352,415,416],{"class":362}," mail:preview\n",[174,418,419,420,423,424,427,428,431,432,434,435,438,439,442],{},"This serves every template at ",[177,421,422],{},"http:\u002F\u002Flocalhost:3005"," with hot reload, rendered against the sample values in ",[177,425,426],{},"apps\u002Fmail-preview\u002Fmaizzle.config.ts",". The app owns no templates of its own — its ",[177,429,430],{},"emails\u002F"," directory is a symlink into ",[177,433,387],{},", so edits there reload live. Its ",[177,436,437],{},"build"," script compiles every template to static HTML in ",[177,440,441],{},"apps\u002Fmail-preview\u002Fdist\u002F",", which CI runs as a template-compilation check.",[444,445,446,452],"tip",{},[174,447,448],{},[449,450,451],"strong",{},"Organizations depend on mail",[174,453,454,455,458,459,461,462,464],{},"Organization invitations are delivered by email, so enabling ",[182,456,457],{"href":57},"organizations"," requires a real transport (",[177,460,246],{}," or ",[177,463,257],{},").",[466,467,468],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .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":348,"searchDepth":470,"depth":470,"links":471},2,[472,473,474,475],{"id":192,"depth":470,"text":193},{"id":297,"depth":470,"text":298},{"id":337,"depth":470,"text":338},{"id":395,"depth":470,"text":396},"packages\u002Fmail owns transactional email: Maizzle-based templates plus a small provider layer. The dashboard uses it for organization invitations and other auth-driven messages.","md",null,{},true,{"title":64,"description":476},"wctX-tfGUUOQfutO7pZgn7WLZU41_ZKvSqoBux50uNk",[484,486],{"title":60,"path":61,"stem":62,"description":485,"children":-1},"apps\u002Fdashboard is a Nuxt 4 app and the single deployable artifact: it serves the UI, the control plane, and authentication from one origin.",{"title":68,"path":69,"stem":70,"description":487,"children":-1},"The dashboard ships English and Italian. Locale policy lives in packages\u002Fi18n; the dashboard wires it into @nuxtjs\u002Fi18n with strategy: 'no_prefix' (the locale is a user preference, not a URL segment).",1787482152499]