[{"data":1,"prerenderedAt":659},["ShallowReactive",2],{"navigation_docs":3,"-agents-approvals":320,"-agents-approvals-surround":654},[4,35,69,109,133,193,228,262,305],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","1.getting-started\u002F3.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"icon":29},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F4.install","i-ph-download-simple",{"title":31,"path":32,"stem":33,"icon":34},"What works today","\u002Fgetting-started\u002Fstatus","1.getting-started\u002F5.status","i-ph-list-checks",{"title":21,"icon":6,"path":36,"stem":37,"children":38,"page":6},"\u002Fconcepts","2.concepts",[39,44,49,54,59,64],{"title":40,"path":41,"stem":42,"icon":43},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-ph-planet",{"title":45,"path":46,"stem":47,"icon":48},"Jobs and durability","\u002Fconcepts\u002Fjobs","2.concepts\u002F2.jobs","i-ph-infinity",{"title":50,"path":51,"stem":52,"icon":53},"Routing","\u002Fconcepts\u002Frouting","2.concepts\u002F3.routing","i-ph-path",{"title":55,"path":56,"stem":57,"icon":58},"Security model","\u002Fconcepts\u002Fsecurity","2.concepts\u002F4.security","i-ph-shield-check",{"title":60,"path":61,"stem":62,"icon":63},"Tenants","\u002Fconcepts\u002Ftenants","2.concepts\u002F5.tenants","i-ph-buildings",{"title":65,"path":66,"stem":67,"icon":68},"Temporal","\u002Fconcepts\u002Ftemporal","2.concepts\u002F6.temporal","i-ph-clock",{"title":70,"icon":6,"path":71,"stem":72,"children":73,"page":6},"Run a fleet","\u002Ffleet","3.fleet",[74,79,84,89,94,99,104],{"title":75,"path":76,"stem":77,"icon":78},"Dev mode","\u002Ffleet\u002Fdev-mode","3.fleet\u002F1.dev-mode","i-ph-laptop",{"title":80,"path":81,"stem":82,"icon":83},"Run a cluster","\u002Ffleet\u002Fcluster","3.fleet\u002F2.cluster","i-ph-hard-drives",{"title":85,"path":86,"stem":87,"icon":88},"Join nodes","\u002Ffleet\u002Fjoin-nodes","3.fleet\u002F3.join-nodes","i-ph-plugs-connected",{"title":90,"path":91,"stem":92,"icon":93},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","3.fleet\u002F4.manage-nodes","i-ph-list-bullets",{"title":95,"path":96,"stem":97,"icon":98},"Secrets","\u002Ffleet\u002Fsecrets","3.fleet\u002F5.secrets","i-ph-key",{"title":100,"path":101,"stem":102,"icon":103},"High availability","\u002Ffleet\u002Fhigh-availability","3.fleet\u002F6.high-availability","i-ph-copy",{"title":105,"path":106,"stem":107,"icon":108},"Upgrades, backups and restores","\u002Ffleet\u002Fupgrades","3.fleet\u002F7.upgrades","i-ph-arrows-clockwise",{"title":110,"icon":6,"path":111,"stem":112,"children":113,"page":6},"Use plugins","\u002Fplugins","4.plugins",[114,119,124,128],{"title":115,"path":116,"stem":117,"icon":118},"What a plugin is","\u002Fplugins\u002Foverview","4.plugins\u002F1.overview","i-ph-puzzle-piece",{"title":120,"path":121,"stem":122,"icon":123},"Install and update","\u002Fplugins\u002Finstall","4.plugins\u002F2.install","i-ph-package",{"title":125,"path":126,"stem":127,"icon":123},"Existing MCP packages","\u002Fplugins\u002Fpackages","4.plugins\u002F3.packages",{"title":129,"path":130,"stem":131,"icon":132},"The catalog","\u002Fplugins\u002Fcatalog","4.plugins\u002F4.catalog","i-ph-books",{"title":134,"icon":6,"path":135,"stem":136,"children":137,"page":6},"Build plugins","\u002Fbuild-plugins","5.build-plugins",[138,143,148,153,158,163,168,173,178,183,188],{"title":139,"path":140,"stem":141,"icon":142},"Your first plugin","\u002Fbuild-plugins\u002Ffirst-plugin","5.build-plugins\u002F1.first-plugin","i-ph-hammer",{"title":144,"path":145,"stem":146,"icon":147},"Harnesses","\u002Fbuild-plugins\u002Fharnesses","5.build-plugins\u002F10.harnesses","i-ph-cpu",{"title":149,"path":150,"stem":151,"icon":152},"Example: support triage","\u002Fbuild-plugins\u002Fexample-support-triage","5.build-plugins\u002F11.example-support-triage","i-ph-lifebuoy",{"title":154,"path":155,"stem":156,"icon":157},"Tools","\u002Fbuild-plugins\u002Ftools","5.build-plugins\u002F2.tools","i-ph-wrench",{"title":159,"path":160,"stem":161,"icon":162},"Agents","\u002Fbuild-plugins\u002Fagents","5.build-plugins\u002F3.agents","i-ph-robot",{"title":164,"path":165,"stem":166,"icon":167},"Skills","\u002Fbuild-plugins\u002Fskills","5.build-plugins\u002F4.skills","i-ph-graduation-cap",{"title":169,"path":170,"stem":171,"icon":172},"Develop and test","\u002Fbuild-plugins\u002Fdevelop-and-test","5.build-plugins\u002F5.develop-and-test","i-ph-flask",{"title":174,"path":175,"stem":176,"icon":177},"Publish and version","\u002Fbuild-plugins\u002Fpublish","5.build-plugins\u002F6.publish","i-ph-tag",{"title":179,"path":180,"stem":181,"icon":182},"Hooks","\u002Fbuild-plugins\u002Fhooks","5.build-plugins\u002F7.hooks","i-ph-anchor",{"title":184,"path":185,"stem":186,"icon":187},"Flows","\u002Fbuild-plugins\u002Fflows","5.build-plugins\u002F8.flows","i-ph-flow-arrow",{"title":189,"path":190,"stem":191,"icon":192},"Evals and quality gates","\u002Fbuild-plugins\u002Fevals","5.build-plugins\u002F9.evals","i-ph-seal-check",{"title":194,"icon":6,"path":195,"stem":196,"children":197,"page":6},"Run agents","\u002Fagents","6.agents",[198,203,208,213,218,223],{"title":199,"path":200,"stem":201,"icon":202},"Run jobs","\u002Fagents\u002Frun-jobs","6.agents\u002F1.run-jobs","i-ph-play",{"title":204,"path":205,"stem":206,"icon":207},"Models and keys","\u002Fagents\u002Fmodels-and-keys","6.agents\u002F2.models-and-keys","i-ph-sparkle",{"title":209,"path":210,"stem":211,"icon":212},"Delegation","\u002Fagents\u002Fdelegation","6.agents\u002F3.delegation","i-ph-git-fork",{"title":214,"path":215,"stem":216,"icon":217},"Contracts and limits","\u002Fagents\u002Fcontracts-and-limits","6.agents\u002F4.contracts-and-limits","i-ph-ruler",{"title":219,"path":220,"stem":221,"icon":222},"Runtime API","\u002Fagents\u002Fruntime-api","6.agents\u002F5.runtime-api","i-ph-plug",{"title":224,"path":225,"stem":226,"icon":227},"Approvals","\u002Fagents\u002Fapprovals","6.agents\u002F6.approvals","i-ph-hand-palm",{"title":229,"icon":6,"path":230,"stem":231,"children":232,"page":6},"Monitor","\u002Fmonitor","7.monitor",[233,238,243,248,253,258],{"title":234,"path":235,"stem":236,"icon":237},"Web UI","\u002Fmonitor\u002Fweb-ui","7.monitor\u002F0.web-ui","i-ph-monitor",{"title":239,"path":240,"stem":241,"icon":242},"Cost and usage","\u002Fmonitor\u002Fcost-and-usage","7.monitor\u002F1.cost-and-usage","i-ph-coins",{"title":244,"path":245,"stem":246,"icon":247},"Node health","\u002Fmonitor\u002Fnodes","7.monitor\u002F2.nodes","i-ph-heartbeat",{"title":249,"path":250,"stem":251,"icon":252},"Job history","\u002Fmonitor\u002Fhistory","7.monitor\u002F3.history","i-ph-clock-counter-clockwise",{"title":254,"path":255,"stem":256,"icon":257},"Tracing and metrics","\u002Fmonitor\u002Fobservability","7.monitor\u002F4.observability","i-ph-chart-line",{"title":259,"path":260,"stem":261,"icon":152},"Troubleshooting","\u002Fmonitor\u002Ftroubleshooting","7.monitor\u002F5.troubleshooting",{"title":263,"icon":6,"path":264,"stem":265,"children":266,"page":6},"Reference","\u002Freference","8.reference",[267,281,286,290,295,300],{"title":268,"icon":269,"path":270,"stem":271,"children":272,"page":6},"CLI","i-ph-terminal-window","\u002Freference\u002Fcli","8.reference\u002F1.cli",[273,277],{"title":274,"path":275,"stem":276},"orchestrator-zero","\u002Freference\u002Fcli\u002Forchestrator-zero","8.reference\u002F1.cli\u002F1.orchestrator-zero",{"title":278,"path":279,"stem":280},"orchestrator-zero-node","\u002Freference\u002Fcli\u002Forchestrator-zero-node","8.reference\u002F1.cli\u002F2.orchestrator-zero-node",{"title":282,"path":283,"stem":284,"icon":285},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","8.reference\u002F2.plugin-manifest","i-ph-file-code",{"title":287,"path":288,"stem":289,"icon":162},"Agent definition","\u002Freference\u002Fagent-definition","8.reference\u002F3.agent-definition",{"title":291,"path":292,"stem":293,"icon":294},"Ports","\u002Freference\u002Fports","8.reference\u002F4.ports","i-ph-network",{"title":296,"path":297,"stem":298,"icon":299},"Environment variables","\u002Freference\u002Fenvironment","8.reference\u002F5.environment","i-ph-brackets-curly",{"title":301,"path":302,"stem":303,"icon":304},"Files and directories","\u002Freference\u002Ffiles","8.reference\u002F6.files","i-ph-tree-structure",{"title":306,"icon":6,"path":307,"stem":308,"children":309,"page":6},"About","\u002Fabout","9.about",[310,315],{"title":311,"path":312,"stem":313,"icon":314},"Licensing","\u002Fabout\u002Flicensing","9.about\u002F1.licensing","i-ph-scales",{"title":316,"path":317,"stem":318,"icon":319},"About these docs","\u002Fabout\u002Fcontributing-docs","9.about\u002F2.contributing-docs","i-ph-pencil-simple",{"id":321,"title":224,"body":322,"description":647,"extension":648,"links":649,"meta":650,"navigation":651,"path":225,"seo":652,"stem":226,"__hash__":653},"docs\u002F6.agents\u002F6.approvals.md",{"type":323,"value":324,"toc":641},"minimark",[325,334,429,432,437,482,485,489,501,504,508,575,585,593,597,612,637],[326,327,328,329,333],"p",{},"Some calls should not happen without a person saying yes: merging a pull request, sending money, deleting data. List them in the tool's ",[330,331,332],"code",{},"requires_approval",", and every call to them waits for a decision.",[335,336,341],"pre",{"className":337,"code":338,"filename":282,"language":339,"meta":340,"style":340},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tools:\n  - id: github\n    mcp: [\"python\", \"-m\", \"github_tools.mcp\"]\n    requires_approval: [github.merge]\n","yaml","",[330,342,343,356,372,414],{"__ignoreMap":340},[344,345,348,352],"span",{"class":346,"line":347},"line",1,[344,349,351],{"class":350},"swJcz","tools",[344,353,355],{"class":354},"sMK4o",":\n",[344,357,359,362,365,368],{"class":346,"line":358},2,[344,360,361],{"class":354},"  -",[344,363,364],{"class":350}," id",[344,366,367],{"class":354},":",[344,369,371],{"class":370},"sfazB"," github\n",[344,373,375,378,380,383,386,389,391,394,397,400,402,404,406,409,411],{"class":346,"line":374},3,[344,376,377],{"class":350},"    mcp",[344,379,367],{"class":354},[344,381,382],{"class":354}," [",[344,384,385],{"class":354},"\"",[344,387,388],{"class":370},"python",[344,390,385],{"class":354},[344,392,393],{"class":354},",",[344,395,396],{"class":354}," \"",[344,398,399],{"class":370},"-m",[344,401,385],{"class":354},[344,403,393],{"class":354},[344,405,396],{"class":354},[344,407,408],{"class":370},"github_tools.mcp",[344,410,385],{"class":354},[344,412,413],{"class":354},"]\n",[344,415,417,420,422,424,427],{"class":346,"line":416},4,[344,418,419],{"class":350},"    requires_approval",[344,421,367],{"class":354},[344,423,382],{"class":354},[344,425,426],{"class":370},"github.merge",[344,428,413],{"class":354},[326,430,431],{},"The tool's plugin decides this, so it holds for every agent that uses the tool, from any plugin.",[433,434,436],"h2",{"id":435},"what-happens","What happens",[438,439,440,455,458,472],"ol",{},[441,442,443,444,446,447,450,451,454],"li",{},"The agent calls ",[330,445,426],{},". Before the call runs, the job asks for a decision and waits. It shows up on the web UI's ",[448,449,224],"strong",{}," page, on the job's page, in ",[330,452,453],{},"orchestrator-zero approval list",", and in the job's live stream.",[441,456,457],{},"An admin approves or denies it, with a comment if they like.",[441,459,460,463,464,467,468,471],{},[448,461,462],{},"Approved:"," the call runs and the agent goes on. ",[448,465,466],{},"Denied:"," the call is not made, and the agent is told who said no and why, for example ",[330,469,470],{},"The call to github.merge was not made: user:kevin denied it: not before the release.",", so it can explain or try something else.",[441,473,474,477,478,481],{},[448,475,476],{},"No answer within 24 hours"," counts as a no: ",[330,479,480],{},"nobody answered",".",[326,483,484],{},"The wait is part of the job's durable state in Temporal. It costs nothing while it lasts, and it survives restarts of servers and nodes: the job goes on wherever its agent can run once someone decides.",[433,486,488],{"id":487},"decide-from-the-web-ui","Decide from the web UI",[326,490,491,493,494,497,498,481],{},[448,492,224],{}," in the sidebar lists everything that waits, with a count, oldest first: what waits, the agent, the job, how long it has waited and when it is denied unless someone answers. Click one to open it in a drawer with the call's arguments. The job's own page shows its pending approvals above its tabs. Write a comment if you want the agent to know why, then ",[448,495,496],{},"Approve"," or ",[448,499,500],{},"Deny",[326,502,503],{},"Operators, admins and owners of the tenant decide; readers see what waits but cannot decide, and see the call's arguments only with the permission to see the tenant's content.",[433,505,507],{"id":506},"decide-from-the-cli","Decide from the CLI",[335,509,514],{"className":510,"code":511,"filename":512,"language":513,"meta":340,"style":340},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","orchestrator-zero approval list\norchestrator-zero approval approve job-bb270cf1-... a-3d3774fd06c3 --comment \"fine by me\"\norchestrator-zero approval deny job-bb270cf1-... a-3d3774fd06c3 --comment \"not before the release\"\n","Terminal","bash",[330,515,516,527,553],{"__ignoreMap":340},[344,517,518,521,524],{"class":346,"line":347},[344,519,274],{"class":520},"sBMFI",[344,522,523],{"class":370}," approval",[344,525,526],{"class":370}," list\n",[344,528,529,531,533,536,539,542,545,547,550],{"class":346,"line":358},[344,530,274],{"class":520},[344,532,523],{"class":370},[344,534,535],{"class":370}," approve",[344,537,538],{"class":370}," job-bb270cf1-...",[344,540,541],{"class":370}," a-3d3774fd06c3",[344,543,544],{"class":370}," --comment",[344,546,396],{"class":354},[344,548,549],{"class":370},"fine by me",[344,551,552],{"class":354},"\"\n",[344,554,555,557,559,562,564,566,568,570,573],{"class":346,"line":374},[344,556,274],{"class":520},[344,558,523],{"class":370},[344,560,561],{"class":370}," deny",[344,563,538],{"class":370},[344,565,541],{"class":370},[344,567,544],{"class":370},[344,569,396],{"class":354},[344,571,572],{"class":370},"not before the release",[344,574,552],{"class":354},[326,576,577,580,581,584],{},[330,578,579],{},"orchestrator-zero run"," and ",[330,582,583],{},"job watch"," show a waiting call as it happens, with the command that approves it:",[335,586,591],{"className":587,"code":589,"language":590,"meta":340},[588],"language-text","helper → team.hello {\"name\":\"e2e\"}\nhelper ⏸ team.hello waits for approval a-3d3774fd06c3: {\"name\": \"e2e\"}\n  orchestrator-zero approval approve job-0879b9bc-... a-3d3774fd06c3   (or deny)\nhelper ▶ team.hello approved by operator:admin: fine by me\nhelper ← team.hello Hello, e2e!\n","text",[330,592,589],{"__ignoreMap":340},[433,594,596],{"id":595},"from-your-own-app","From your own app",[326,598,599,600,604,605,580,608,611],{},"The ",[601,602,603],"a",{"href":220},"runtime API"," has ",[330,606,607],{},"ListApprovals",[330,609,610],{},"DecideApproval",". The edge records who decided from the caller's credentials; a request cannot name someone else.",[613,614,615,616,619,620,623,624,628,629,632,633,636],"note",{},"Approvals cover tool calls of Pydantic AI agents, flow steps with ",[330,617,618],{},"approval:",", hooks that answer ",[330,621,622],{},"escalate",", and the tools of a ",[601,625,627],{"href":626},"\u002Fbuild-plugins\u002Fharnesses#hooks-and-approvals-for-the-sessions-tools","harness session"," listed in the agent's ",[330,630,631],{},"harness.requires_approval",", which wait as ",[330,634,635],{},"claude-agent-sdk.Bash"," and the like. A timeout other than 24 hours, and approvals limited to a role per tenant, come later.",[638,639,640],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":340,"searchDepth":358,"depth":358,"links":642},[643,644,645,646],{"id":435,"depth":358,"text":436},{"id":487,"depth":358,"text":488},{"id":506,"depth":358,"text":507},{"id":595,"depth":358,"text":596},"Let a person decide before a tool call runs, with the job waiting durably until someone does.","md",null,{},{"icon":227},{"title":224,"description":647},"opQpXzcyYPGiA2DODUYhTxaTN6t_8WUlHasKTpeRWaI",[655,657],{"title":219,"path":220,"stem":221,"description":656,"icon":222,"children":-1},"Start and follow jobs from your own apps, over Connect, gRPC or gRPC-Web.",{"title":234,"path":235,"stem":236,"description":658,"icon":237,"children":-1},"Nodes, agents, plugins, jobs and their cost in a browser, with the commands to add nodes.",1791135412908]