[{"data":1,"prerenderedAt":695},["ShallowReactive",2],{"navigation_docs":3,"-guide-deployment":168,"-guide-deployment-surround":690},[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":72,"body":170,"description":176,"extension":685,"links":686,"meta":687,"navigation":252,"path":73,"seo":688,"stem":74,"__hash__":689},"docs\u002F1.guide\u002F16.deployment.md",{"type":171,"value":172,"toc":676},"minimark",[173,177,182,217,235,239,404,408,419,423,433,437,440,462,466,487,529,556,568,634,643,647,672],[174,175,176],"p",{},"The dashboard is the single deployable artifact: one Nuxt app serving the UI, the control plane, and authentication from one origin.",[178,179,181],"h2",{"id":180},"build-and-run","Build and run",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","aube run build\nnode apps\u002Fdashboard\u002F.output\u002Fserver\u002Findex.mjs\n","bash","",[190,191,192,208],"code",{"__ignoreMap":188},[193,194,197,201,205],"span",{"class":195,"line":196},"line",1,[193,198,200],{"class":199},"sBMFI","aube",[193,202,204],{"class":203},"sfazB"," run",[193,206,207],{"class":203}," build\n",[193,209,211,214],{"class":195,"line":210},2,[193,212,213],{"class":199},"node",[193,215,216],{"class":203}," apps\u002Fdashboard\u002F.output\u002Fserver\u002Findex.mjs\n",[174,218,219,222,223,226,227,230,231,234],{},[190,220,221],{},"nuxt build"," emits a self-contained ",[190,224,225],{},".output\u002F"," bundle — no ",[190,228,229],{},"node_modules"," needed at runtime. The server listens on port 3000 by default; override with ",[190,232,233],{},"PORT",".",[178,236,238],{"id":237},"production-checklist","Production checklist",[240,241,244,267,287,306,333,356,374,393],"ul",{"className":242},[243],"contains-task-list",[245,246,249,254,255,259,260,263,264,234],"li",{"className":247},[248],"task-list-item",[250,251],"input",{"disabled":252,"type":253},true,"checkbox"," ",[256,257,258],"strong",{},"Session secret"," — set ",[190,261,262],{},"NUXT_BETTER_AUTH_SECRET"," (this exact name; the development fallback is ignored in production). Generate with ",[190,265,266],{},"openssl rand -base64 32",[245,268,270,254,272,275,276,279,280,283,284,234],{"className":269},[248],[250,271],{"disabled":252,"type":253},[256,273,274],{},"Postgres"," — point ",[190,277,278],{},"DATABASE_URL"," at a managed database and apply the schema once with ",[190,281,282],{},"aube run db:migrate",". See ",[285,286,143],"a",{"href":144},[245,288,290,254,292,295,296,299,300,303,304,234],{"className":289},[248],[250,291],{"disabled":252,"type":253},[256,293,294],{},"Auth policy"," — decide ",[190,297,298],{},"AUTH_ENABLE_SIGNUP",", GitHub OAuth credentials, and organization flags, then ",[256,301,302],{},"build with them set",": the auth pages capture capabilities at build time. See ",[285,305,38],{"href":45},[245,307,309,254,311,314,315,318,319,322,323,326,327,330,331,234],{"className":308},[248],[250,310],{"disabled":252,"type":253},[256,312,313],{},"Mail"," — configure Resend (",[190,316,317],{},"RESEND_API_KEY","; ",[190,320,321],{},"MAIL_PROVIDER=resend"," is optional) or set ",[190,324,325],{},"MAIL_PROVIDER=smtp"," with its SMTP variables. With neither, ",[190,328,329],{},"console"," only logs. Required if invitations or organizations are enabled. See ",[285,332,64],{"href":65},[245,334,336,254,338,341,342,345,346,349,350,353,354,234],{"className":335},[248],[250,337],{"disabled":252,"type":253},[256,339,340],{},"Control plane"," — issue bearer tokens via ",[190,343,344],{},"AGENT_ZERO_CONTROL_PLANE_TOKENS",", allow-list repositories via ",[190,347,348],{},"AGENT_ZERO_CONTROL_PLANE_REPOSITORIES",", and grant modes via ",[190,351,352],{},"AGENT_ZERO_CONTROL_PLANE_MODES",". Without them, mutations are rejected. See ",[285,355,33],{"href":34},[245,357,359,254,361,259,364,367,368,371,372,234],{"className":358},[248],[250,360],{"disabled":252,"type":253},[256,362,363],{},"Webhooks",[190,365,366],{},"GITHUB_WEBHOOK_SECRET"," and ",[190,369,370],{},"AGENT_ZERO_CHECKOUT_PATH","; the webhook route fails closed (503) until both are set. Configure the webhook on the source-control side per ",[285,373,161],{"href":162},[245,375,377,254,379,382,383,386,387,390,391,234],{"className":376},[248],[250,378],{"disabled":252,"type":253},[256,380,381],{},"Isolated execution"," — production runs that write require ",[190,384,385],{},"runner.isolation: container"," in repository policy, with an image and resource limits. The included ",[190,388,389],{},"LocalRunner"," is for trusted local development only. See the ",[285,392,139],{"href":140},[245,394,396,254,398,401,402,234],{"className":395},[248],[250,397],{"disabled":252,"type":253},[256,399,400],{},"Model provider"," — select the provider in repository policy and set its credential environment variable. See ",[285,403,157],{"href":158},[178,405,407],{"id":406},"task-history-storage","Task history storage",[174,409,410,411,414,415,418],{},"Task history uses the ViteHub KV Runtime Helper: filesystem-backed ",[190,412,413],{},"fs-lite"," by default (",[190,416,417],{},".data\u002Fkv","), with Cloudflare KV, Deno KV, or Upstash available as driver configuration without touching application code. Records are redacted before they are written.",[178,420,422],{"id":421},"hosted-sandboxes","Hosted sandboxes",[174,424,425,426,429,430,432],{},"For hosted execution, the provider-neutral ",[190,427,428],{},"RunnerPool"," supports vendor adapters (ViteHub, Cloudflare Sandbox, Vercel Sandbox were evaluated — see ",[285,431,165],{"href":166},"). Quota checks run before provisioning, leases are bounded, and expired sandboxes are stopped.",[178,434,436],{"id":435},"rebuild-triggers","Rebuild triggers",[174,438,439],{},"Rebuild the app whenever you change:",[240,441,442,455],{},[245,443,444,446,447,450,451,454],{},[190,445,298],{},", ",[190,448,449],{},"GITHUB_CLIENT_ID"," \u002F ",[190,452,453],{},"GITHUB_CLIENT_SECRET",", or organization flags (login-page capabilities are captured at build time);",[245,456,457,458,461],{},"anything in ",[190,459,460],{},"packages\u002F*"," (the server bundle inlines them).",[178,463,465],{"id":464},"vercel","Vercel",[174,467,468,471,472,475,476,479,480,482,483,486],{},[190,469,470],{},"apps\u002Fdashboard"," ships its own ",[190,473,474],{},"vercel.json"," so it can be deployed as a Vercel project with ",[256,477,478],{},"Root\nDirectory"," set to ",[190,481,470],{},": the install and build commands ",[190,484,485],{},"cd"," back to the workspace root\nso aube and Turborepo resolve the monorepo correctly.",[174,488,489,490,493,494,497,498,501,502,505,506,508,509,513,514,517,518,520,521,524,525,528],{},"The build command sets ",[190,491,492],{},"NITRO_PRESET=vercel",". ",[190,495,496],{},"nuxt.config.ts"," registers ",[190,499,500],{},"vite-hub\u002Fnuxt"," with a\ndeployment preset, and that preset pins Nitro's own, so the build target is a deliberate choice\nrather than something Nitro auto-detects: without that variable every build emits the self-hosted\n",[190,503,504],{},"node-server"," bundle in ",[190,507,225],{},", which Vercel cannot serve — it fails with ",[510,511,512],"em",{},"No Output Directory\nnamed \"dist\" found",". With it, ",[190,515,516],{},"config\u002Fenv.ts"," resolves the ",[190,519,464],{}," preset and the build writes\n",[190,522,523],{},".vercel\u002Foutput"," (Vercel's Build Output API) instead. ",[190,526,527],{},"VITEHUB_HOSTING"," selects the same target and\ntakes precedence.",[174,530,531,532,367,535,537,538,541,542,545,546,548,549,367,552,555],{},"Because they select the target, ",[190,533,534],{},"NITRO_PRESET",[190,536,527],{}," are declared on the app build\ntasks in ",[190,539,540],{},"turbo.jsonc",": Turborepo's strict environment mode hides a variable a task does not\ndeclare (",[190,543,544],{},"NITRO_*"," is forwarded by its Nuxt framework inference, ",[190,547,527],{}," is not), and\ndeclaring them keeps the target in the cache key so a self-hosted build is never restored into a\nhosted one. Both ",[190,550,551],{},".output\u002F**",[190,553,554],{},".vercel\u002Foutput\u002F**"," are listed as build outputs for the same\nreason.",[174,557,558,559,367,562,565,566,234],{},"On a hosted preset the KV Runtime Helper resolves the host's own driver rather than the filesystem\none, because a serverless function has nowhere durable to write: on Vercel that is Upstash, so set\n",[190,560,561],{},"KV_REST_API_URL",[190,563,564],{},"KV_REST_API_TOKEN"," or task history fails at runtime. See\n",[285,567,143],{"href":144},[569,570,571,576],"warning",{},[174,572,573],{},[256,574,575],{},"Upstream version mismatch",[174,577,578,581,582,584,585,588,589,592,593,596,597,599,600,603,604,607,608,610,611,614,615,618,619,622,623,626,627,630,631,633],{},[190,579,580],{},"vite-hub@0.0.3","'s ",[190,583,464],{}," plan checks for a server function at\n",[190,586,587],{},".vercel\u002Foutput\u002Ffunctions\u002F__server.func\u002Findex.mjs",", while the installed ",[190,590,591],{},"nitropack@2.13.4"," emits —\nand routes to — ",[190,594,595],{},"__fallback.func",". The bundle is correct; only the name ViteHub looks for is not,\nso ",[190,598,496],{}," links that name to the emitted function for the length of the check and removes\nthe link afterwards. That bridge is registered as a Nitro ",[256,601,602],{},"module",", not under ",[190,605,606],{},"nitro.hooks",": a\nhandler placed there replaces the preset's own handler for the same hook, and the ",[190,609,464],{}," preset\nwrites ",[190,612,613],{},"config.json"," and every ",[190,616,617],{},".vc-config.json"," from its ",[190,620,621],{},"compiled"," hook — without them the\ndirectory exists but Vercel cannot read it, and the build fails with the same missing-",[190,624,625],{},"dist"," error.\nDelete the module and ",[190,628,629],{},"viteHubVercelEntryName"," in ",[190,632,516],{}," once a ViteHub release\nexpects the preset's own layout.",[174,635,636,639,640,642],{},[190,637,638],{},"apps\u002Fmarketing"," sets ",[190,641,534],{}," the same way. It composes no ViteHub integration, so the\nvariable only picks its Nitro preset, and it has no KV store to configure.",[178,644,646],{"id":645},"documentation-site","Documentation site",[174,648,649,652,653,655,656,479,659,661,662,664,665,668,669,234],{},[190,650,651],{},"apps\u002Fdocs"," is not deployed with the dashboard. It ships its own ",[190,654,474],{}," so it can be\ndeployed as a separate Vercel project with ",[256,657,658],{},"Root Directory",[190,660,651],{},": the install and\nbuild commands ",[190,663,485],{}," back to the workspace root so ",[190,666,667],{},"pnpm"," and Turborepo resolve the monorepo\ncorrectly, and the build output is ",[190,670,671],{},".output",[673,674,675],"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":188,"searchDepth":210,"depth":210,"links":677},[678,679,680,681,682,683,684],{"id":180,"depth":210,"text":181},{"id":237,"depth":210,"text":238},{"id":406,"depth":210,"text":407},{"id":421,"depth":210,"text":422},{"id":435,"depth":210,"text":436},{"id":464,"depth":210,"text":465},{"id":645,"depth":210,"text":646},"md",null,{},{"title":72,"description":176},"xvVsIdWr3oZGC-F4knSUgyXpvpf-ulkOvEzD0P7jR34",[691,693],{"title":68,"path":69,"stem":70,"description":692,"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).",{"title":76,"path":77,"stem":78,"description":694,"children":-1},"Agent Zero is a TypeScript monorepo. Every tool below was chosen deliberately; the toolchain rules in AGENTS.md are binding for contributors and coding agents alike.",1787482152132]