[{"data":1,"prerenderedAt":1342},["ShallowReactive",2],{"navigation_docs":3,"-build-plugins-first-plugin":320,"-build-plugins-first-plugin-surround":1337},[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":139,"body":322,"description":1331,"extension":996,"links":1332,"meta":1333,"navigation":1334,"path":140,"seo":1335,"stem":141,"__hash__":1336},"docs\u002F5.build-plugins\u002F1.first-plugin.md",{"type":323,"value":324,"toc":1322},"minimark",[325,338,345,1290,1294,1318],[326,327,328,329,333,334,337],"p",{},"You will build ",[330,331,332],"code",{},"ops-tools",": a plugin with a tool that reports disk space and system facts, and an agent, ",[330,335,336],{},"ops-helper",", that answers questions about the machine it runs on. Because the tool runs on the job's home node, the answer is about that node.",[326,339,340,341,344],{},"You need the binaries and the runtime bundle from the ",[342,343,16],"a",{"href":17},", and an Anthropic key for the agent.",[346,347,349,354,418,426,430,445,689,693,709,856,860,863,991,1018,1025,1029,1058,1076,1147,1157,1161,1164,1254,1257,1281],"steps",{"level":348},"2",[350,351,353],"h2",{"id":352},"scaffold-it","Scaffold it",[355,356,362],"pre",{"className":357,"code":358,"filename":359,"language":360,"meta":361,"style":361},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","orchestrator-zero plugin new ops-tools --template python-agent \\\n  --description \"Answers questions about the machine it runs on\"\ncd ops-tools\n","Terminal","bash","",[330,363,364,392,408],{"__ignoreMap":361},[365,366,369,372,376,379,382,385,388],"span",{"class":367,"line":368},"line",1,[365,370,274],{"class":371},"sBMFI",[365,373,375],{"class":374},"sfazB"," plugin",[365,377,378],{"class":374}," new",[365,380,381],{"class":374}," ops-tools",[365,383,384],{"class":374}," --template",[365,386,387],{"class":374}," python-agent",[365,389,391],{"class":390},"sTEyZ"," \\\n",[365,393,395,398,402,405],{"class":367,"line":394},2,[365,396,397],{"class":374},"  --description",[365,399,401],{"class":400},"sMK4o"," \"",[365,403,404],{"class":374},"Answers questions about the machine it runs on",[365,406,407],{"class":400},"\"\n",[365,409,411,415],{"class":367,"line":410},3,[365,412,414],{"class":413},"s2Zo4","cd",[365,416,417],{"class":374}," ops-tools\n",[355,419,424],{"className":420,"code":422,"language":423,"meta":361},[421],"language-text","ops-tools\u002F\n├── oz0-plugin.yaml          the manifest\n├── pyproject.toml           the Python project (mcp==2.2.0)\n├── agents\u002Fops-tools.yaml    the agent\n├── prompts\u002Fops-tools.md     its instructions\n├── skills\u002Fops-tools\u002FSKILL.md\n└── src\u002Fops_tools\u002Fserver.py  the MCP server\n","text",[330,425,422],{"__ignoreMap":361},[350,427,429],{"id":428},"write-the-tool","Write the tool",[326,431,432,433,436,437,440,441,444],{},"Replace ",[330,434,435],{},"src\u002Fops_tools\u002Fserver.py",". Every ",[330,438,439],{},"@server.tool()"," function becomes a function agents can call as ",[330,442,443],{},"ops_tools.\u003Cfunction>","; its docstring and type hints tell the model what it does.",[355,446,450],{"className":447,"code":448,"filename":435,"language":449,"meta":361,"style":361},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"\"\"MCP server for ops-tools: facts about the machine it runs on.\"\"\"\n\nimport os\nimport platform\nimport shutil\n\nfrom mcp.server import MCPServer\n\nserver = MCPServer(\"ops-tools\")\n\n\n@server.tool()\ndef disk_usage(path: str = \"\u002F\") -> dict:\n    \"\"\"Total, used and free space of the disk that holds path, in gigabytes.\"\"\"\n    total, used, free = shutil.disk_usage(path)\n    gb = 1024**3\n    return {\n        \"path\": path,\n        \"total_gb\": round(total \u002F gb, 1),\n        \"used_gb\": round(used \u002F gb, 1),\n        \"free_gb\": round(free \u002F gb, 1),\n    }\n\n\n@server.tool()\ndef system_info() -> dict:\n    \"\"\"Host name, operating system, architecture and number of CPUs of this machine.\"\"\"\n    return {\n        \"host\": platform.node(),\n        \"os\": platform.system(),\n        \"release\": platform.release(),\n        \"arch\": platform.machine(),\n        \"cpus\": os.cpu_count(),\n    }\n\n\ndef main() -> None:\n    server.run(\"stdio\")\n\n\nif __name__ == \"__main__\":\n    main()\n","python",[330,451,452,457,463,468,474,480,485,491,496,502,507,512,518,524,530,536,542,548,554,560,566,572,578,583,588,593,599,605,610,616,622,628,634,640,645,650,655,661,667,672,677,683],{"__ignoreMap":361},[365,453,454],{"class":367,"line":368},[365,455,456],{},"\"\"\"MCP server for ops-tools: facts about the machine it runs on.\"\"\"\n",[365,458,459],{"class":367,"line":394},[365,460,462],{"emptyLinePlaceholder":461},true,"\n",[365,464,465],{"class":367,"line":410},[365,466,467],{},"import os\n",[365,469,471],{"class":367,"line":470},4,[365,472,473],{},"import platform\n",[365,475,477],{"class":367,"line":476},5,[365,478,479],{},"import shutil\n",[365,481,483],{"class":367,"line":482},6,[365,484,462],{"emptyLinePlaceholder":461},[365,486,488],{"class":367,"line":487},7,[365,489,490],{},"from mcp.server import MCPServer\n",[365,492,494],{"class":367,"line":493},8,[365,495,462],{"emptyLinePlaceholder":461},[365,497,499],{"class":367,"line":498},9,[365,500,501],{},"server = MCPServer(\"ops-tools\")\n",[365,503,505],{"class":367,"line":504},10,[365,506,462],{"emptyLinePlaceholder":461},[365,508,510],{"class":367,"line":509},11,[365,511,462],{"emptyLinePlaceholder":461},[365,513,515],{"class":367,"line":514},12,[365,516,517],{},"@server.tool()\n",[365,519,521],{"class":367,"line":520},13,[365,522,523],{},"def disk_usage(path: str = \"\u002F\") -> dict:\n",[365,525,527],{"class":367,"line":526},14,[365,528,529],{},"    \"\"\"Total, used and free space of the disk that holds path, in gigabytes.\"\"\"\n",[365,531,533],{"class":367,"line":532},15,[365,534,535],{},"    total, used, free = shutil.disk_usage(path)\n",[365,537,539],{"class":367,"line":538},16,[365,540,541],{},"    gb = 1024**3\n",[365,543,545],{"class":367,"line":544},17,[365,546,547],{},"    return {\n",[365,549,551],{"class":367,"line":550},18,[365,552,553],{},"        \"path\": path,\n",[365,555,557],{"class":367,"line":556},19,[365,558,559],{},"        \"total_gb\": round(total \u002F gb, 1),\n",[365,561,563],{"class":367,"line":562},20,[365,564,565],{},"        \"used_gb\": round(used \u002F gb, 1),\n",[365,567,569],{"class":367,"line":568},21,[365,570,571],{},"        \"free_gb\": round(free \u002F gb, 1),\n",[365,573,575],{"class":367,"line":574},22,[365,576,577],{},"    }\n",[365,579,581],{"class":367,"line":580},23,[365,582,462],{"emptyLinePlaceholder":461},[365,584,586],{"class":367,"line":585},24,[365,587,462],{"emptyLinePlaceholder":461},[365,589,591],{"class":367,"line":590},25,[365,592,517],{},[365,594,596],{"class":367,"line":595},26,[365,597,598],{},"def system_info() -> dict:\n",[365,600,602],{"class":367,"line":601},27,[365,603,604],{},"    \"\"\"Host name, operating system, architecture and number of CPUs of this machine.\"\"\"\n",[365,606,608],{"class":367,"line":607},28,[365,609,547],{},[365,611,613],{"class":367,"line":612},29,[365,614,615],{},"        \"host\": platform.node(),\n",[365,617,619],{"class":367,"line":618},30,[365,620,621],{},"        \"os\": platform.system(),\n",[365,623,625],{"class":367,"line":624},31,[365,626,627],{},"        \"release\": platform.release(),\n",[365,629,631],{"class":367,"line":630},32,[365,632,633],{},"        \"arch\": platform.machine(),\n",[365,635,637],{"class":367,"line":636},33,[365,638,639],{},"        \"cpus\": os.cpu_count(),\n",[365,641,643],{"class":367,"line":642},34,[365,644,577],{},[365,646,648],{"class":367,"line":647},35,[365,649,462],{"emptyLinePlaceholder":461},[365,651,653],{"class":367,"line":652},36,[365,654,462],{"emptyLinePlaceholder":461},[365,656,658],{"class":367,"line":657},37,[365,659,660],{},"def main() -> None:\n",[365,662,664],{"class":367,"line":663},38,[365,665,666],{},"    server.run(\"stdio\")\n",[365,668,670],{"class":367,"line":669},39,[365,671,462],{"emptyLinePlaceholder":461},[365,673,675],{"class":367,"line":674},40,[365,676,462],{"emptyLinePlaceholder":461},[365,678,680],{"class":367,"line":679},41,[365,681,682],{},"if __name__ == \"__main__\":\n",[365,684,686],{"class":367,"line":685},42,[365,687,688],{},"    main()\n",[350,690,692],{"id":691},"keep-the-tool-on-the-home-node","Keep the tool on the home node",[326,694,695,696,699,700,704,705,708],{},"The template sets ",[330,697,698],{},"affinity: any",", which lets the tool run on any node. A tool about ",[701,702,703],"em",{},"this"," machine must run where the job runs, so remove that line and the default, ",[330,706,707],{},"node",", applies:",[355,710,714],{"className":711,"code":712,"filename":282,"language":713,"meta":361,"style":361},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apiVersion: oz0\u002Fv1\nname: ops-tools\nversion: 0.1.0\ndescription: Answers questions about the machine it runs on\nruntime: python\ntools:\n  - id: ops_tools\n    mcp: [\"python\", \"-m\", \"ops_tools.server\"]\nagents: [agents\u002F]\nskills: [skills\u002F]\n","yaml",[330,715,716,728,737,748,758,768,776,789,828,842],{"__ignoreMap":361},[365,717,718,722,725],{"class":367,"line":368},[365,719,721],{"class":720},"swJcz","apiVersion",[365,723,724],{"class":400},":",[365,726,727],{"class":374}," oz0\u002Fv1\n",[365,729,730,733,735],{"class":367,"line":394},[365,731,732],{"class":720},"name",[365,734,724],{"class":400},[365,736,417],{"class":374},[365,738,739,742,744],{"class":367,"line":410},[365,740,741],{"class":720},"version",[365,743,724],{"class":400},[365,745,747],{"class":746},"sbssI"," 0.1.0\n",[365,749,750,753,755],{"class":367,"line":470},[365,751,752],{"class":720},"description",[365,754,724],{"class":400},[365,756,757],{"class":374}," Answers questions about the machine it runs on\n",[365,759,760,763,765],{"class":367,"line":476},[365,761,762],{"class":720},"runtime",[365,764,724],{"class":400},[365,766,767],{"class":374}," python\n",[365,769,770,773],{"class":367,"line":482},[365,771,772],{"class":720},"tools",[365,774,775],{"class":400},":\n",[365,777,778,781,784,786],{"class":367,"line":487},[365,779,780],{"class":400},"  -",[365,782,783],{"class":720}," id",[365,785,724],{"class":400},[365,787,788],{"class":374}," ops_tools\n",[365,790,791,794,796,799,802,804,806,809,811,814,816,818,820,823,825],{"class":367,"line":493},[365,792,793],{"class":720},"    mcp",[365,795,724],{"class":400},[365,797,798],{"class":400}," [",[365,800,801],{"class":400},"\"",[365,803,449],{"class":374},[365,805,801],{"class":400},[365,807,808],{"class":400},",",[365,810,401],{"class":400},[365,812,813],{"class":374},"-m",[365,815,801],{"class":400},[365,817,808],{"class":400},[365,819,401],{"class":400},[365,821,822],{"class":374},"ops_tools.server",[365,824,801],{"class":400},[365,826,827],{"class":400},"]\n",[365,829,830,833,835,837,840],{"class":367,"line":498},[365,831,832],{"class":720},"agents",[365,834,724],{"class":400},[365,836,798],{"class":400},[365,838,839],{"class":374},"agents\u002F",[365,841,827],{"class":400},[365,843,844,847,849,851,854],{"class":367,"line":504},[365,845,846],{"class":720},"skills",[365,848,724],{"class":400},[365,850,798],{"class":400},[365,852,853],{"class":374},"skills\u002F",[365,855,827],{"class":400},[350,857,859],{"id":858},"write-the-agent","Write the agent",[326,861,862],{},"Rename the agent and give it the two functions:",[355,864,867],{"className":711,"code":865,"filename":866,"language":713,"meta":361,"style":361},"name: ops-helper\ndescription: Answers questions about the machine it runs on\nruntime: pydantic-ai\nmodel:\n  primary: anthropic\u002Fclaude-sonnet-5-5\n  fallback: [anthropic\u002Fclaude-haiku-4-5]\ninstructions: prompts\u002Fops-tools.md\ntools: [ops_tools.disk_usage, ops_tools.system_info]\nlimits:\n  max_steps: 10\n  max_tokens: 50000\n  timeout: 2m\n","agents\u002Fops-tools.yaml",[330,868,869,878,886,895,902,912,926,936,954,961,971,981],{"__ignoreMap":361},[365,870,871,873,875],{"class":367,"line":368},[365,872,732],{"class":720},[365,874,724],{"class":400},[365,876,877],{"class":374}," ops-helper\n",[365,879,880,882,884],{"class":367,"line":394},[365,881,752],{"class":720},[365,883,724],{"class":400},[365,885,757],{"class":374},[365,887,888,890,892],{"class":367,"line":410},[365,889,762],{"class":720},[365,891,724],{"class":400},[365,893,894],{"class":374}," pydantic-ai\n",[365,896,897,900],{"class":367,"line":470},[365,898,899],{"class":720},"model",[365,901,775],{"class":400},[365,903,904,907,909],{"class":367,"line":476},[365,905,906],{"class":720},"  primary",[365,908,724],{"class":400},[365,910,911],{"class":374}," anthropic\u002Fclaude-sonnet-5-5\n",[365,913,914,917,919,921,924],{"class":367,"line":482},[365,915,916],{"class":720},"  fallback",[365,918,724],{"class":400},[365,920,798],{"class":400},[365,922,923],{"class":374},"anthropic\u002Fclaude-haiku-4-5",[365,925,827],{"class":400},[365,927,928,931,933],{"class":367,"line":487},[365,929,930],{"class":720},"instructions",[365,932,724],{"class":400},[365,934,935],{"class":374}," prompts\u002Fops-tools.md\n",[365,937,938,940,942,944,947,949,952],{"class":367,"line":493},[365,939,772],{"class":720},[365,941,724],{"class":400},[365,943,798],{"class":400},[365,945,946],{"class":374},"ops_tools.disk_usage",[365,948,808],{"class":400},[365,950,951],{"class":374}," ops_tools.system_info",[365,953,827],{"class":400},[365,955,956,959],{"class":367,"line":498},[365,957,958],{"class":720},"limits",[365,960,775],{"class":400},[365,962,963,966,968],{"class":367,"line":504},[365,964,965],{"class":720},"  max_steps",[365,967,724],{"class":400},[365,969,970],{"class":746}," 10\n",[365,972,973,976,978],{"class":367,"line":509},[365,974,975],{"class":720},"  max_tokens",[365,977,724],{"class":400},[365,979,980],{"class":746}," 50000\n",[365,982,983,986,988],{"class":367,"line":514},[365,984,985],{"class":720},"  timeout",[365,987,724],{"class":400},[365,989,990],{"class":374}," 2m\n",[355,992,997],{"className":993,"code":994,"filename":995,"language":996,"meta":361,"style":361},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","You are ops-helper. You answer questions about the machine you run on.\n\nUse ops_tools.system_info and ops_tools.disk_usage to get facts; never guess them.\nAnswer in two or three sentences and name the host.\n","prompts\u002Fops-tools.md","md",[330,998,999,1004,1008,1013],{"__ignoreMap":361},[365,1000,1001],{"class":367,"line":368},[365,1002,1003],{"class":390},"You are ops-helper. You answer questions about the machine you run on.\n",[365,1005,1006],{"class":367,"line":394},[365,1007,462],{"emptyLinePlaceholder":461},[365,1009,1010],{"class":367,"line":410},[365,1011,1012],{"class":390},"Use ops_tools.system_info and ops_tools.disk_usage to get facts; never guess them.\n",[365,1014,1015],{"class":367,"line":470},[365,1016,1017],{"class":390},"Answer in two or three sentences and name the host.\n",[326,1019,1020,1021,1024],{},"Update ",[330,1022,1023],{},"skills\u002Fops-tools\u002FSKILL.md"," to say when to use the two functions.",[350,1026,1028],{"id":1027},"lint-and-run-it","Lint and run it",[355,1030,1032],{"className":357,"code":1031,"filename":359,"language":360,"meta":361,"style":361},"uv lock\norchestrator-zero plugin lint\norchestrator-zero dev\n",[330,1033,1034,1042,1051],{"__ignoreMap":361},[365,1035,1036,1039],{"class":367,"line":368},[365,1037,1038],{"class":371},"uv",[365,1040,1041],{"class":374}," lock\n",[365,1043,1044,1046,1048],{"class":367,"line":394},[365,1045,274],{"class":371},[365,1047,375],{"class":374},[365,1049,1050],{"class":374}," lint\n",[365,1052,1053,1055],{"class":367,"line":410},[365,1054,274],{"class":371},[365,1056,1057],{"class":374}," dev\n",[326,1059,1060,1063,1064,1067,1068,1071,1072,1075],{},[330,1061,1062],{},"plugin lint"," runs the same checks the edge runs before an install: unknown fields are errors, so a typo does not pass. ",[330,1065,1066],{},"dev"," prints the ",[330,1069,1070],{},"export OZ0_CONTEXT=..."," line and ",[330,1073,1074],{},"ops-tools ... ready in ...: ops_tools.disk_usage, ops_tools.system_info",". In a second terminal:",[355,1077,1079],{"className":357,"code":1078,"filename":359,"language":360,"meta":361,"style":361},"export OZ0_CONTEXT=...                        # the line dev printed\nprintf %s \"$ANTHROPIC_API_KEY\" | orchestrator-zero secret set ANTHROPIC_API_KEY\norchestrator-zero run ops-helper \"How much free disk does this machine have?\"\n",[330,1080,1081,1100,1130],{"__ignoreMap":361},[365,1082,1083,1087,1090,1093,1096],{"class":367,"line":368},[365,1084,1086],{"class":1085},"spNyl","export",[365,1088,1089],{"class":390}," OZ0_CONTEXT",[365,1091,1092],{"class":400},"=",[365,1094,1095],{"class":390},"...                        ",[365,1097,1099],{"class":1098},"sHwdD","# the line dev printed\n",[365,1101,1102,1105,1108,1110,1113,1115,1118,1121,1124,1127],{"class":367,"line":394},[365,1103,1104],{"class":413},"printf",[365,1106,1107],{"class":374}," %s",[365,1109,401],{"class":400},[365,1111,1112],{"class":390},"$ANTHROPIC_API_KEY",[365,1114,801],{"class":400},[365,1116,1117],{"class":400}," |",[365,1119,1120],{"class":371}," orchestrator-zero",[365,1122,1123],{"class":374}," secret",[365,1125,1126],{"class":374}," set",[365,1128,1129],{"class":374}," ANTHROPIC_API_KEY\n",[365,1131,1132,1134,1137,1140,1142,1145],{"class":367,"line":410},[365,1133,274],{"class":371},[365,1135,1136],{"class":374}," run",[365,1138,1139],{"class":374}," ops-helper",[365,1141,401],{"class":400},[365,1143,1144],{"class":374},"How much free disk does this machine have?",[365,1146,407],{"class":400},[326,1148,1149,1150,1153,1154,1156],{},"The agent calls ",[330,1151,1152],{},"ops_tools.system_info"," and ",[330,1155,946],{}," on the node that picked up the job, and answers with that machine's numbers.",[350,1158,1160],{"id":1159},"publish-it","Publish it",[326,1162,1163],{},"A plugin installs from Git. Commit it, tag a release and push it to a repository the edge can reach:",[355,1165,1167],{"className":357,"code":1166,"filename":359,"language":360,"meta":361,"style":361},"git init -b main && git add . && git commit -m \"ops-tools 0.1.0\"\ngit tag v0.1.0\ngit remote add origin https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fops-tools.git\ngit push -u origin main --tags\n",[330,1168,1169,1212,1222,1237],{"__ignoreMap":361},[365,1170,1171,1174,1177,1180,1183,1186,1189,1192,1195,1197,1199,1202,1205,1207,1210],{"class":367,"line":368},[365,1172,1173],{"class":371},"git",[365,1175,1176],{"class":374}," init",[365,1178,1179],{"class":374}," -b",[365,1181,1182],{"class":374}," main",[365,1184,1185],{"class":400}," &&",[365,1187,1188],{"class":371}," git",[365,1190,1191],{"class":374}," add",[365,1193,1194],{"class":374}," .",[365,1196,1185],{"class":400},[365,1198,1188],{"class":371},[365,1200,1201],{"class":374}," commit",[365,1203,1204],{"class":374}," -m",[365,1206,401],{"class":400},[365,1208,1209],{"class":374},"ops-tools 0.1.0",[365,1211,407],{"class":400},[365,1213,1214,1216,1219],{"class":367,"line":394},[365,1215,1173],{"class":371},[365,1217,1218],{"class":374}," tag",[365,1220,1221],{"class":374}," v0.1.0\n",[365,1223,1224,1226,1229,1231,1234],{"class":367,"line":410},[365,1225,1173],{"class":371},[365,1227,1228],{"class":374}," remote",[365,1230,1191],{"class":374},[365,1232,1233],{"class":374}," origin",[365,1235,1236],{"class":374}," https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fops-tools.git\n",[365,1238,1239,1241,1244,1247,1249,1251],{"class":367,"line":470},[365,1240,1173],{"class":371},[365,1242,1243],{"class":374}," push",[365,1245,1246],{"class":374}," -u",[365,1248,1233],{"class":374},[365,1250,1182],{"class":374},[365,1252,1253],{"class":374}," --tags\n",[326,1255,1256],{},"Then, against your cluster:",[355,1258,1260],{"className":357,"code":1259,"filename":359,"language":360,"meta":361,"style":361},"orchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fops-tools\norchestrator-zero catalog\n",[330,1261,1262,1274],{"__ignoreMap":361},[365,1263,1264,1266,1268,1271],{"class":367,"line":368},[365,1265,274],{"class":371},[365,1267,375],{"class":374},[365,1269,1270],{"class":374}," install",[365,1272,1273],{"class":374}," https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fops-tools\n",[365,1275,1276,1278],{"class":367,"line":394},[365,1277,274],{"class":371},[365,1279,1280],{"class":374}," catalog\n",[326,1282,1283,1284,1286,1287,1289],{},"Every node of the tenant builds it and starts the tool, and ",[330,1285,336],{}," can run anywhere in the fleet. Ask it from different nodes' points of view by giving them labels and requiring one in the agent (see ",[342,1288,50],{"href":51},").",[350,1291,1293],{"id":1292},"next","Next",[1295,1296,1297,1303,1308,1313],"ul",{},[1298,1299,1300,1302],"li",{},[342,1301,154],{"href":155},": affinity, environment and what the model sees.",[1298,1304,1305,1307],{},[342,1306,159],{"href":160},": every field of an agent definition.",[1298,1309,1310,1312],{},[342,1311,169],{"href":170},": the dev loop and calling a tool directly.",[1298,1314,1315,1317],{},[342,1316,174],{"href":175},": refs, tags and pinning.",[1319,1320,1321],"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 pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":361,"searchDepth":394,"depth":394,"links":1323},[1324,1325,1326,1327,1328,1329,1330],{"id":352,"depth":394,"text":353},{"id":428,"depth":394,"text":429},{"id":691,"depth":394,"text":692},{"id":858,"depth":394,"text":859},{"id":1027,"depth":394,"text":1028},{"id":1159,"depth":394,"text":1160},{"id":1292,"depth":394,"text":1293},"Write a tool that reports on the machine it runs on, give it to an agent, and publish it.",null,{},{"icon":142},{"title":139,"description":1331},"j_sYT1DSLUo4bs-X3cxLUT1iwVQgziH0TGOC3RQK24I",[1338,1340],{"title":129,"path":130,"stem":131,"description":1339,"icon":132,"children":-1},"See which agents, tools and skills a tenant has, and which nodes are ready to run them.",{"title":144,"path":145,"stem":146,"description":1341,"icon":147,"children":-1},"Run a whole session of an existing agent harness, such as the Claude Agent SDK, as a job.",1791135406265]