[{"data":1,"prerenderedAt":702},["ShallowReactive",2],{"navigation_docs":3,"-fleet-secrets":320,"-fleet-secrets-surround":697},[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":95,"body":322,"description":690,"extension":691,"links":692,"meta":693,"navigation":694,"path":96,"seo":695,"stem":97,"__hash__":696},"docs\u002F3.fleet\u002F5.secrets.md",{"type":323,"value":324,"toc":685},"minimark",[325,329,334,337,464,467,471,555,570,574,577,610,631,634,669,681],[326,327,328],"p",{},"Secrets are stored per tenant, sealed with AES-GCM under the cluster's master key. The value never comes back out of the admin API; only the edge unseals it, when it needs it.",[330,331,333],"h2",{"id":332},"set-list-and-delete","Set, list and delete",[326,335,336],{},"The value comes from stdin, an environment variable or a file, never from the command line, so it does not end up in your shell history:",[338,339,345],"pre",{"className":340,"code":341,"filename":342,"language":343,"meta":344,"style":344},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","printf %s \"$ANTHROPIC_API_KEY\" | orchestrator-zero secret set ANTHROPIC_API_KEY\norchestrator-zero secret set OPENAI_API_KEY --from-env OPENAI_API_KEY\norchestrator-zero secret set GITHUB_TOKEN --from-file ~\u002F.secrets\u002Fgithub-token --tenant acme\n\norchestrator-zero secret list          # names only, never values\norchestrator-zero secret delete GITHUB_TOKEN\n","Terminal","bash","",[346,347,348,388,406,430,437,451],"code",{"__ignoreMap":344},[349,350,353,357,361,365,369,372,375,379,382,385],"span",{"class":351,"line":352},"line",1,[349,354,356],{"class":355},"s2Zo4","printf",[349,358,360],{"class":359},"sfazB"," %s",[349,362,364],{"class":363},"sMK4o"," \"",[349,366,368],{"class":367},"sTEyZ","$ANTHROPIC_API_KEY",[349,370,371],{"class":363},"\"",[349,373,374],{"class":363}," |",[349,376,378],{"class":377},"sBMFI"," orchestrator-zero",[349,380,381],{"class":359}," secret",[349,383,384],{"class":359}," set",[349,386,387],{"class":359}," ANTHROPIC_API_KEY\n",[349,389,391,393,395,397,400,403],{"class":351,"line":390},2,[349,392,274],{"class":377},[349,394,381],{"class":359},[349,396,384],{"class":359},[349,398,399],{"class":359}," OPENAI_API_KEY",[349,401,402],{"class":359}," --from-env",[349,404,405],{"class":359}," OPENAI_API_KEY\n",[349,407,409,411,413,415,418,421,424,427],{"class":351,"line":408},3,[349,410,274],{"class":377},[349,412,381],{"class":359},[349,414,384],{"class":359},[349,416,417],{"class":359}," GITHUB_TOKEN",[349,419,420],{"class":359}," --from-file",[349,422,423],{"class":359}," ~\u002F.secrets\u002Fgithub-token",[349,425,426],{"class":359}," --tenant",[349,428,429],{"class":359}," acme\n",[349,431,433],{"class":351,"line":432},4,[349,434,436],{"emptyLinePlaceholder":435},true,"\n",[349,438,440,442,444,447],{"class":351,"line":439},5,[349,441,274],{"class":377},[349,443,381],{"class":359},[349,445,446],{"class":359}," list",[349,448,450],{"class":449},"sHwdD","          # names only, never values\n",[349,452,454,456,458,461],{"class":351,"line":453},6,[349,455,274],{"class":377},[349,457,381],{"class":359},[349,459,460],{"class":359}," delete",[349,462,463],{"class":359}," GITHUB_TOKEN\n",[326,465,466],{},"Every change is recorded in the audit log, without the value.",[330,468,470],{"id":469},"what-uses-them-today","What uses them today",[472,473,474,487],"table",{},[475,476,477],"thead",{},[478,479,480,484],"tr",{},[481,482,483],"th",{},"Secret",[481,485,486],{},"Used by",[488,489,490,504,517,533,544],"tbody",{},[478,491,492,498],{},[493,494,495],"td",{},[346,496,497],{},"ANTHROPIC_API_KEY",[493,499,500,501],{},"The LLM gateway, for models named ",[346,502,503],{},"anthropic\u002F...",[478,505,506,511],{},[493,507,508],{},[346,509,510],{},"OPENAI_API_KEY",[493,512,500,513,516],{},[346,514,515],{},"openai\u002F..."," and OpenAI-compatible APIs",[478,518,519,522],{},[493,520,521],{},"Any name you choose",[493,523,524,525,528,529],{},"The token for a private plugin repository, named with ",[346,526,527],{},"plugin install --secret","; see ",[530,531,120],"a",{"href":532},"\u002Fplugins\u002Finstall#a-private-repository",[478,534,535,541],{},[493,536,537,538],{},"Any name a plugin lists in ",[346,539,540],{},"requires.secrets",[493,542,543],{},"That plugin's tools, hooks and harnesses, as environment variables; see below",[478,545,546,549],{},[493,547,548],{},"Any name a flow's webhook names",[493,550,551,552],{},"The edge, to check calls to the webhook; see ",[530,553,184],{"href":554},"\u002Fbuild-plugins\u002Fflows#start-one-from-a-webhook",[326,556,557,558,561,562,565,566,569],{},"When a model call needs a key the tenant does not have, the gateway answers ",[346,559,560],{},"412"," with the command that sets it. An agent with a fallback model on another provider falls back to it; when no model has a key, the job fails at once with ",[346,563,564],{},"MissingKey"," and that command. See ",[530,567,259],{"href":568},"\u002Fmonitor\u002Ftroubleshooting#a-job-fails-with-a-model-error",".",[330,571,573],{"id":572},"secrets-for-plugins","Secrets for plugins",[326,575,576],{},"A plugin lists the tenant secrets its processes need in its manifest:",[338,578,582],{"className":579,"code":580,"filename":282,"language":581,"meta":344,"style":344},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","requires:\n  secrets: [JEV_API_KEY]\n","yaml",[346,583,584,593],{"__ignoreMap":344},[349,585,586,590],{"class":351,"line":352},[349,587,589],{"class":588},"swJcz","requires",[349,591,592],{"class":363},":\n",[349,594,595,598,601,604,607],{"class":351,"line":390},[349,596,597],{"class":588},"  secrets",[349,599,600],{"class":363},":",[349,602,603],{"class":363}," [",[349,605,606],{"class":359},"JEV_API_KEY",[349,608,609],{"class":363},"]\n",[338,611,613],{"className":340,"code":612,"filename":342,"language":343,"meta":344,"style":344},"orchestrator-zero secret set JEV_API_KEY --from-file ~\u002F.secrets\u002Fjev-api-key\n",[346,614,615],{"__ignoreMap":344},[349,616,617,619,621,623,626,628],{"class":351,"line":352},[349,618,274],{"class":377},[349,620,381],{"class":359},[349,622,384],{"class":359},[349,624,625],{"class":359}," JEV_API_KEY",[349,627,420],{"class":359},[349,629,630],{"class":359}," ~\u002F.secrets\u002Fjev-api-key\n",[326,632,633],{},"When the edge sends a node its plugins, it unseals the secrets each one declares and sends them along, over the node's mTLS connection, to the nodes that run that plugin and to no others. The node keeps them in memory, never on disk, and starts the plugin's tools, hooks and harnesses with each one as an environment variable of the same name. Other plugins' processes do not get them.",[635,636,637,653,663],"ul",{},[638,639,640,644,645,648,649,652],"li",{},[641,642,643],"strong",{},"A missing secret:"," ",[346,646,647],{},"plugin install"," warns, and nodes report the plugin ",[346,650,651],{},"failed"," with the command that sets it, keeping a previous version running if they had one.",[638,654,655,658,659,662],{},[641,656,657],{},"Rotation:"," after ",[346,660,661],{},"secret set",", every node that runs a plugin declaring the secret gets the new value within seconds and restarts its runtime, as for a new version. Running jobs carry on.",[638,664,665,668],{},[641,666,667],{},"Trust:"," a secret is in the environment of the plugin's processes on every node that runs it. Install plugins that declare secrets as carefully as the secrets themselves.",[326,670,671,674,675,677,678,680],{},[346,672,673],{},"plugin lint"," warns when a plugin asks for ",[346,676,497],{}," or ",[346,679,510],{},": with the gateway's key, a plugin could call the provider directly, unmetered and outside every budget. Agents and harnesses reach models through the gateway without it.",[682,683,684],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":344,"searchDepth":390,"depth":390,"links":686},[687,688,689],{"id":332,"depth":390,"text":333},{"id":469,"depth":390,"text":470},{"id":572,"depth":390,"text":573},"Store provider API keys and other secrets per tenant, sealed with the master key.","md",null,{},{"icon":98},{"title":95,"description":690},"YNUbj8haPCZcatbcgEnOkWdy3W6fIee_6yuVb-UKcPM",[698,700],{"title":90,"path":91,"stem":92,"description":699,"icon":93,"children":-1},"List, inspect, accept, block, purge and remove nodes, and manage join tokens.",{"title":100,"path":101,"stem":102,"description":701,"icon":103,"children":-1},"Run two or more servers so nodes and jobs keep going when one stops.",1791135409698]