[{"data":1,"prerenderedAt":944},["ShallowReactive",2],{"navigation_docs":3,"-build-plugins-hooks":320,"-build-plugins-hooks-surround":939},[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":179,"body":322,"description":932,"extension":933,"links":934,"meta":935,"navigation":936,"path":180,"seo":937,"stem":181,"__hash__":938},"docs\u002F5.build-plugins\u002F7.hooks.md",{"type":323,"value":324,"toc":926},"minimark",[325,345,353,576,648,651,656,770,784,788,798,847,856,860,882,886,889,912,922],[326,327,328,329,333,334,333,337,340,341,344],"p",{},"A hook is a function of your plugin that the platform asks at a set moment: before a tool call, after it, when a job starts, when it ends. It answers ",[330,331,332],"strong",{},"allow",", ",[330,335,336],{},"deny",[330,338,339],{},"modify"," or ",[330,342,343],{},"escalate",". Use hooks for checks of your own: a risk score from your own model, a rule engine, a policy on which repositories an agent may push to, a signature on every answer.",[326,346,347,348,352],{},"A hook is an ordinary MCP function of one of your plugin's tools, named with ",[349,350,351],"code",{},"call",":",[354,355,360],"pre",{"className":356,"code":357,"filename":282,"language":358,"meta":359,"style":359},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tools:\n  - id: policy\n    mcp: [\"python\", \"-m\", \"policy.server\"]\nhooks:\n  - on: pre_tool_call\n    call: policy.check            # the function that answers\n    match: { tools: [\"github.merge\", \"github.push\"] }\n    timeout: 2s\n    on_timeout: escalate\n  - on: job_end\n    call: policy.check\n    match: { agents: [pr-reviewer] }\n","yaml","",[349,361,362,375,390,432,440,454,469,509,520,531,543,553],{"__ignoreMap":359},[363,364,367,371],"span",{"class":365,"line":366},"line",1,[363,368,370],{"class":369},"swJcz","tools",[363,372,374],{"class":373},"sMK4o",":\n",[363,376,378,381,384,386],{"class":365,"line":377},2,[363,379,380],{"class":373},"  -",[363,382,383],{"class":369}," id",[363,385,352],{"class":373},[363,387,389],{"class":388},"sfazB"," policy\n",[363,391,393,396,398,401,404,407,409,412,415,418,420,422,424,427,429],{"class":365,"line":392},3,[363,394,395],{"class":369},"    mcp",[363,397,352],{"class":373},[363,399,400],{"class":373}," [",[363,402,403],{"class":373},"\"",[363,405,406],{"class":388},"python",[363,408,403],{"class":373},[363,410,411],{"class":373},",",[363,413,414],{"class":373}," \"",[363,416,417],{"class":388},"-m",[363,419,403],{"class":373},[363,421,411],{"class":373},[363,423,414],{"class":373},[363,425,426],{"class":388},"policy.server",[363,428,403],{"class":373},[363,430,431],{"class":373},"]\n",[363,433,435,438],{"class":365,"line":434},4,[363,436,437],{"class":369},"hooks",[363,439,374],{"class":373},[363,441,443,445,449,451],{"class":365,"line":442},5,[363,444,380],{"class":373},[363,446,448],{"class":447},"sfNiH"," on",[363,450,352],{"class":373},[363,452,453],{"class":388}," pre_tool_call\n",[363,455,457,460,462,465],{"class":365,"line":456},6,[363,458,459],{"class":369},"    call",[363,461,352],{"class":373},[363,463,464],{"class":388}," policy.check",[363,466,468],{"class":467},"sHwdD","            # the function that answers\n",[363,470,472,475,477,480,483,485,487,489,492,494,496,498,501,503,506],{"class":365,"line":471},7,[363,473,474],{"class":369},"    match",[363,476,352],{"class":373},[363,478,479],{"class":373}," {",[363,481,482],{"class":369}," tools",[363,484,352],{"class":373},[363,486,400],{"class":373},[363,488,403],{"class":373},[363,490,491],{"class":388},"github.merge",[363,493,403],{"class":373},[363,495,411],{"class":373},[363,497,414],{"class":373},[363,499,500],{"class":388},"github.push",[363,502,403],{"class":373},[363,504,505],{"class":373},"]",[363,507,508],{"class":373}," }\n",[363,510,512,515,517],{"class":365,"line":511},8,[363,513,514],{"class":369},"    timeout",[363,516,352],{"class":373},[363,518,519],{"class":388}," 2s\n",[363,521,523,526,528],{"class":365,"line":522},9,[363,524,525],{"class":369},"    on_timeout",[363,527,352],{"class":373},[363,529,530],{"class":388}," escalate\n",[363,532,534,536,538,540],{"class":365,"line":533},10,[363,535,380],{"class":373},[363,537,448],{"class":447},[363,539,352],{"class":373},[363,541,542],{"class":388}," job_end\n",[363,544,546,548,550],{"class":365,"line":545},11,[363,547,459],{"class":369},[363,549,352],{"class":373},[363,551,552],{"class":388}," policy.check\n",[363,554,556,558,560,562,565,567,569,572,574],{"class":365,"line":555},12,[363,557,474],{"class":369},[363,559,352],{"class":373},[363,561,479],{"class":373},[363,563,564],{"class":369}," agents",[363,566,352],{"class":373},[363,568,400],{"class":373},[363,570,571],{"class":388},"pr-reviewer",[363,573,505],{"class":373},[363,575,508],{"class":373},[354,577,581],{"className":578,"code":579,"filename":580,"language":406,"meta":359,"style":359},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from mcp.server import MCPServer\n\nserver = MCPServer(\"policy\")\n\n\n@server.tool()\ndef check(event: dict) -> dict:\n    \"\"\"Decide on a call or a job.\"\"\"\n    if event[\"event\"] == \"pre_tool_call\" and event[\"arguments\"].get(\"branch\") == \"main\":\n        return {\"decision\": \"escalate\", \"reason\": \"a push to main\"}\n    if event[\"event\"] == \"job_end\":\n        return {\"decision\": \"modify\", \"output\": event[\"output\"] + \"\\n\\nChecked by policy.\"}\n    return {\"decision\": \"allow\"}\n","src\u002Fpolicy\u002Fserver.py",[349,582,583,588,594,599,603,607,612,617,622,627,632,637,642],{"__ignoreMap":359},[363,584,585],{"class":365,"line":366},[363,586,587],{},"from mcp.server import MCPServer\n",[363,589,590],{"class":365,"line":377},[363,591,593],{"emptyLinePlaceholder":592},true,"\n",[363,595,596],{"class":365,"line":392},[363,597,598],{},"server = MCPServer(\"policy\")\n",[363,600,601],{"class":365,"line":434},[363,602,593],{"emptyLinePlaceholder":592},[363,604,605],{"class":365,"line":442},[363,606,593],{"emptyLinePlaceholder":592},[363,608,609],{"class":365,"line":456},[363,610,611],{},"@server.tool()\n",[363,613,614],{"class":365,"line":471},[363,615,616],{},"def check(event: dict) -> dict:\n",[363,618,619],{"class":365,"line":511},[363,620,621],{},"    \"\"\"Decide on a call or a job.\"\"\"\n",[363,623,624],{"class":365,"line":522},[363,625,626],{},"    if event[\"event\"] == \"pre_tool_call\" and event[\"arguments\"].get(\"branch\") == \"main\":\n",[363,628,629],{"class":365,"line":533},[363,630,631],{},"        return {\"decision\": \"escalate\", \"reason\": \"a push to main\"}\n",[363,633,634],{"class":365,"line":545},[363,635,636],{},"    if event[\"event\"] == \"job_end\":\n",[363,638,639],{"class":365,"line":555},[363,640,641],{},"        return {\"decision\": \"modify\", \"output\": event[\"output\"] + \"\\n\\nChecked by policy.\"}\n",[363,643,645],{"class":365,"line":644},13,[363,646,647],{},"    return {\"decision\": \"allow\"}\n",[326,649,650],{},"A plugin's hooks watch the tenant's agents from every plugin, not only its own.",[652,653,655],"h2",{"id":654},"events","Events",[657,658,659,683],"table",{},[660,661,662],"thead",{},[663,664,665,669,672,678],"tr",{},[666,667,668],"th",{},"Event",[666,670,671],{},"When",[666,673,674,677],{},[349,675,676],{},"event"," holds",[666,679,680,682],{},[349,681,339],{}," replaces",[684,685,686,709,732,751],"tbody",{},[663,687,688,694,697,705],{},[689,690,691],"td",{},[349,692,693],{},"pre_tool_call",[689,695,696],{},"Before a tool function runs",[689,698,699,333,702],{},[349,700,701],{},"tool",[349,703,704],{},"arguments",[689,706,707],{},[349,708,704],{},[663,710,711,716,719,728],{},[689,712,713],{},[349,714,715],{},"post_tool_call",[689,717,718],{},"After it ran, before the model sees the result",[689,720,721,333,723,333,725],{},[349,722,701],{},[349,724,704],{},[349,726,727],{},"result",[689,729,730],{},[349,731,727],{},[663,733,734,739,742,747],{},[689,735,736],{},[349,737,738],{},"job_start",[689,740,741],{},"When a job starts, before the agent does anything",[689,743,744],{},[349,745,746],{},"input",[689,748,749],{},[349,750,746],{},[663,752,753,758,761,766],{},[689,754,755],{},[349,756,757],{},"job_end",[689,759,760],{},"When the agent has answered, before the job ends",[689,762,763],{},[349,764,765],{},"output",[689,767,768],{},[349,769,765],{},[326,771,772,773,775,776,779,780,783],{},"Every event also has ",[349,774,676],{}," (its name), ",[349,777,778],{},"job"," and ",[349,781,782],{},"agent",".",[652,785,787],{"id":786},"decisions","Decisions",[326,789,790,791,794,795,352],{},"The function returns an object with ",[349,792,793],{},"decision"," and, if you like, ",[349,796,797],{},"reason",[799,800,801,809,824,831],"ul",{},[802,803,804,808],"li",{},[330,805,806],{},[349,807,332],{},": go ahead.",[802,810,811,815,816,819,820,823],{},[330,812,813],{},[349,814,336],{},": before a call, it is not made and the model reads ",[349,817,818],{},"The call to github.merge was not made: hook policy.check denied it: \u003Creason>.","; after a call, the model gets that instead of the result; at the start or end of a job, the job fails with ",[349,821,822],{},"HookDenied"," and the reason.",[802,825,826,830],{},[330,827,828],{},[349,829,339],{},": go ahead with the new value under the key in the table above.",[802,832,833,837,838,842,843,846],{},[330,834,835],{},[349,836,343],{},": a person decides, as an ",[839,840,841],"a",{"href":225},"approval"," of kind ",[349,844,845],{},"hook"," with your reason; yes counts as allow, no as deny.",[326,848,849,850,852,853,855],{},"Several hooks on one event run in the order of their plugins, then of the manifest. The first ",[349,851,336],{}," ends it, and each ",[349,854,339],{}," feeds the next hook.",[652,857,859],{"id":858},"timeouts-and-failures","Timeouts and failures",[326,861,862,863,866,867,869,870,873,874,333,876,878,879,881],{},"A hook has ",[349,864,865],{},"timeout"," to answer, 2 seconds by default and 30 at most. When it does not answer in time, fails, or answers something without a valid ",[349,868,793],{},", its ",[349,871,872],{},"on_timeout"," applies: ",[349,875,332],{},[349,877,336],{}," (the default) or ",[349,880,343],{},". Hooks fail closed unless you say otherwise.",[652,883,885],{"id":884},"where-they-run","Where they run",[326,887,888],{},"Hooks run on the job's home node, the node where its tools run, as tool calls from the job's workflow: each one is in the job's history with its answer, and a replay does not call it again. Which hooks apply is read once, when the job starts, from the node that takes it.",[326,890,891,892,896,897,899,900,903,904,907,908,911],{},"Tool calls inside a ",[839,893,895],{"href":894},"\u002Fbuild-plugins\u002Fharnesses#hooks-and-approvals-for-the-sessions-tools","harness"," session reach ",[349,898,693],{}," hooks too, named ",[349,901,902],{},"\u003Charness>.\u003Ctool>",", such as ",[349,905,906],{},"claude-agent-sdk.Bash",", so ",[349,909,910],{},"match: { tools: [\"claude-agent-sdk.Bash\"] }"," sees every command a Claude session runs.",[913,914,915,917,918,921],"note",{},[349,916,715],{}," for harness tools, and ",[349,919,920],{},"pre_llm_call",", are accepted by the manifest and do not run yet.",[923,924,925],"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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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);}",{"title":359,"searchDepth":377,"depth":377,"links":927},[928,929,930,931],{"id":654,"depth":377,"text":655},{"id":786,"depth":377,"text":787},{"id":858,"depth":377,"text":859},{"id":884,"depth":377,"text":885},"Your own checks before and after tool calls and at the start and end of a job.","md",null,{},{"icon":182},{"title":179,"description":932},"NtMZb6kbQeDjSSlI1hXHEF30GXCuxQ6m1U1ICMLNNHU",[940,942],{"title":174,"path":175,"stem":176,"description":941,"icon":177,"children":-1},"Ship a plugin with a Git tag, and control exactly what every node runs.",{"title":184,"path":185,"stem":186,"description":943,"icon":187,"children":-1},"Declarative steps that chain tools, agents, conditions and approvals.",1791135411629]