[{"data":1,"prerenderedAt":3629},["ShallowReactive",2],{"navigation_docs":3,"docs-page:\u002Fbuild\u002Fparts\u002Fevent-sources":1849,"docs-surround:\u002Fbuild\u002Fparts\u002Fevent-sources":3624},[4,72,214,304,947,1040,1230,1504,1590,1701,1830],{"title":5,"path":6,"stem":7,"children":8,"icon":71},"Get started","\u002Fgetting-started","01.getting-started\u002F00.index",[9,10,15,20,25,36],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","01.getting-started\u002F01.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","01.getting-started\u002F02.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","01.getting-started\u002F03.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"children":29,"icon":31},"Install","\u002Fgetting-started\u002Finstall","01.getting-started\u002F04.install\u002F00.index",[30,32],{"title":26,"path":27,"stem":28,"icon":31},"i-ph-download-simple",{"title":33,"path":34,"stem":35},"Prepare the Linux sandbox","\u002Fgetting-started\u002Finstall\u002Flinux-sandbox","01.getting-started\u002F04.install\u002F01.linux-sandbox",{"title":37,"path":38,"stem":39,"children":40,"icon":42},"Web UI","\u002Fgetting-started\u002Fweb-ui","01.getting-started\u002F05.web-ui\u002F00.index",[41,43,47,51,55,59,63,67],{"title":37,"path":38,"stem":39,"icon":42},"i-ph-monitor",{"title":44,"path":45,"stem":46},"Choose a tenant","\u002Fgetting-started\u002Fweb-ui\u002Ftenants","01.getting-started\u002F05.web-ui\u002F01.tenants",{"title":48,"path":49,"stem":50},"Find a page","\u002Fgetting-started\u002Fweb-ui\u002Fnavigation","01.getting-started\u002F05.web-ui\u002F02.navigation",{"title":52,"path":53,"stem":54},"Use the chat drawer","\u002Fgetting-started\u002Fweb-ui\u002Fchats","01.getting-started\u002F05.web-ui\u002F03.chats",{"title":56,"path":57,"stem":58},"Create and edit records","\u002Fgetting-started\u002Fweb-ui\u002Fforms","01.getting-started\u002F05.web-ui\u002F04.forms",{"title":60,"path":61,"stem":62},"Keyboard and accessibility","\u002Fgetting-started\u002Fweb-ui\u002Faccessibility","01.getting-started\u002F05.web-ui\u002F05.accessibility",{"title":64,"path":65,"stem":66},"Accounts and permissions","\u002Fgetting-started\u002Fweb-ui\u002Faccounts","01.getting-started\u002F05.web-ui\u002F06.accounts",{"title":68,"path":69,"stem":70},"Console page directory","\u002Fgetting-started\u002Fweb-ui\u002Fpage-directory","01.getting-started\u002F05.web-ui\u002F07.page-directory",false,{"title":21,"path":73,"stem":74,"children":75,"icon":71},"\u002Fconcepts","02.concepts\u002F00.index",[76,77,82,87,92,123,128,143,166,185,204,209],{"title":21,"path":73,"stem":74},{"title":78,"path":79,"stem":80,"icon":81},"Architecture","\u002Fconcepts\u002Farchitecture","02.concepts\u002F01.architecture","i-ph-planet",{"title":83,"path":84,"stem":85,"icon":86},"Jobs and durability","\u002Fconcepts\u002Fjobs","02.concepts\u002F02.jobs","i-ph-infinity",{"title":88,"path":89,"stem":90,"icon":91},"Routing","\u002Fconcepts\u002Frouting","02.concepts\u002F03.routing","i-ph-path",{"title":93,"path":94,"stem":95,"children":96,"icon":98},"Security model","\u002Fconcepts\u002Fsecurity","02.concepts\u002F04.security\u002F00.index",[97,99,103,107,111,115,119],{"title":93,"path":94,"stem":95,"icon":98},"i-ph-shield-check",{"title":100,"path":101,"stem":102},"Node identity and tenant secrets","\u002Fconcepts\u002Fsecurity\u002Fidentity-and-secrets","02.concepts\u002F04.security\u002F01.identity-and-secrets",{"title":104,"path":105,"stem":106},"Plugin processes and operator exemptions","\u002Fconcepts\u002Fsecurity\u002Fplugins","02.concepts\u002F04.security\u002F02.plugins",{"title":108,"path":109,"stem":110},"Sandbox tiers and routing","\u002Fconcepts\u002Fsecurity\u002Fsandbox-tiers","02.concepts\u002F04.security\u002F03.sandbox-tiers",{"title":112,"path":113,"stem":114},"Sandbox egress rules","\u002Fconcepts\u002Fsecurity\u002Fegress","02.concepts\u002F04.security\u002F04.egress",{"title":116,"path":117,"stem":118},"Protected files and sandbox limits","\u002Fconcepts\u002Fsecurity\u002Fprotected-files","02.concepts\u002F04.security\u002F05.protected-files",{"title":120,"path":121,"stem":122},"Security assurance","\u002Fconcepts\u002Fsecurity\u002Fassurance","02.concepts\u002F04.security\u002F06.assurance",{"title":124,"path":125,"stem":126,"icon":127},"Temporal","\u002Fconcepts\u002Ftemporal","02.concepts\u002F05.temporal","i-ph-clock",{"title":129,"path":130,"stem":131,"children":132,"icon":134},"Limits and scaling","\u002Fconcepts\u002Flimits-and-scaling","02.concepts\u002F06.limits-and-scaling\u002F00.index",[133,135,139],{"title":129,"path":130,"stem":131,"icon":134},"i-ph-gauge",{"title":136,"path":137,"stem":138},"Tenant and queue limits","\u002Fconcepts\u002Flimits-and-scaling\u002Flimits","02.concepts\u002F06.limits-and-scaling\u002F01.limits",{"title":140,"path":141,"stem":142},"Capacity measurements","\u002Fconcepts\u002Flimits-and-scaling\u002Fmeasurements","02.concepts\u002F06.limits-and-scaling\u002F02.measurements",{"title":144,"path":145,"stem":146,"children":147,"icon":149},"Threat model","\u002Fconcepts\u002Fthreat-model","02.concepts\u002F07.threat-model\u002F00.index",[148,150,154,158,162],{"title":144,"path":145,"stem":146,"icon":149},"i-ph-crosshair",{"title":151,"path":152,"stem":153},"Trust boundaries and compromise","\u002Fconcepts\u002Fthreat-model\u002Ftrust-boundaries","02.concepts\u002F07.threat-model\u002F01.trust-boundaries",{"title":155,"path":156,"stem":157},"Harness and tool boundaries","\u002Fconcepts\u002Fthreat-model\u002Fharness-tools","02.concepts\u002F07.threat-model\u002F02.harness-tools",{"title":159,"path":160,"stem":161},"Known security gaps","\u002Fconcepts\u002Fthreat-model\u002Fknown-gaps","02.concepts\u002F07.threat-model\u002F03.known-gaps",{"title":163,"path":164,"stem":165},"Origins, sequences and tool results","\u002Fconcepts\u002Fthreat-model\u002Forigins-and-results","02.concepts\u002F07.threat-model\u002F04.origins-and-results",{"title":167,"path":168,"stem":169,"children":170,"icon":172},"Outbound connections","\u002Fconcepts\u002Foutbound-connections","02.concepts\u002F08.outbound-connections\u002F00.index",[171,173,177,181],{"title":167,"path":168,"stem":169,"icon":172},"i-ph-arrow-square-out",{"title":174,"path":175,"stem":176},"Server outbound connections","\u002Fconcepts\u002Foutbound-connections\u002Fserver","02.concepts\u002F08.outbound-connections\u002F01.server",{"title":178,"path":179,"stem":180},"Node and plugin outbound connections","\u002Fconcepts\u002Foutbound-connections\u002Fnodes-and-plugins","02.concepts\u002F08.outbound-connections\u002F02.nodes-and-plugins",{"title":182,"path":183,"stem":184},"Addresses a model provider fetches","\u002Fconcepts\u002Foutbound-connections\u002Fprovider-fetches","02.concepts\u002F08.outbound-connections\u002F03.provider-fetches",{"title":186,"path":187,"stem":188,"children":189,"icon":191},"Run receipts","\u002Fconcepts\u002Frun-receipts","02.concepts\u002F09.run-receipts\u002F00.index",[190,192,196,200],{"title":186,"path":187,"stem":188,"icon":191},"i-ph-receipt",{"title":193,"path":194,"stem":195},"Authority envelopes and delegation","\u002Fconcepts\u002Frun-receipts\u002Fauthority","02.concepts\u002F09.run-receipts\u002F01.authority",{"title":197,"path":198,"stem":199},"Call bindings and budget charges","\u002Fconcepts\u002Frun-receipts\u002Fcalls-and-charges","02.concepts\u002F09.run-receipts\u002F02.calls-and-charges",{"title":201,"path":202,"stem":203},"Verify run receipts offline","\u002Fconcepts\u002Frun-receipts\u002Fverify","02.concepts\u002F09.run-receipts\u002F03.verify",{"title":205,"path":206,"stem":207,"icon":208},"Delegation and identity","\u002Fconcepts\u002Fdelegation-and-identity","02.concepts\u002F10.delegation-and-identity","i-ph-identification-badge",{"title":210,"path":211,"stem":212,"icon":213},"How a tool call is decided","\u002Fconcepts\u002Fhow-a-tool-call-is-decided","02.concepts\u002F11.how-a-tool-call-is-decided","i-ph-list-checks",{"title":215,"path":216,"stem":217,"children":218,"icon":71},"Run","\u002Fagents","03.agents\u002F00.index",[219,221,226,231,236,240,245,250,268,299],{"title":220,"path":216,"stem":217},"Run agents",{"title":222,"path":223,"stem":224,"icon":225},"Run jobs","\u002Fagents\u002Frun-jobs","03.agents\u002F01.run-jobs","i-ph-play",{"title":227,"path":228,"stem":229,"icon":230},"Job history","\u002Fagents\u002Fhistory","03.agents\u002F02.history","i-ph-clock-counter-clockwise",{"title":232,"path":233,"stem":234,"icon":235},"Long jobs","\u002Fagents\u002Flong-jobs","03.agents\u002F03.long-jobs","i-ph-hourglass-medium",{"title":237,"path":238,"stem":239,"icon":235},"Waiting for events","\u002Fagents\u002Fwaiting-for-events","03.agents\u002F04.waiting-for-events",{"title":241,"path":242,"stem":243,"icon":244},"Delegation","\u002Fagents\u002Fdelegation","03.agents\u002F05.delegation","i-ph-git-fork",{"title":246,"path":247,"stem":248,"icon":249},"Colleagues and the board","\u002Fagents\u002Fcolleagues","03.agents\u002F06.colleagues","i-ph-chats-circle",{"title":251,"path":252,"stem":253,"children":254,"icon":249},"Conversations","\u002Fagents\u002Fconversations","03.agents\u002F07.conversations\u002F00.index",[255,256,260,264],{"title":251,"path":252,"stem":253,"icon":249},{"title":257,"path":258,"stem":259},"Conversation access and history","\u002Fagents\u002Fconversations\u002Faccess-and-history","03.agents\u002F07.conversations\u002F02.access-and-history",{"title":261,"path":262,"stem":263},"Use conversations from an app","\u002Fagents\u002Fconversations\u002Fapps","03.agents\u002F07.conversations\u002F03.apps",{"title":265,"path":266,"stem":267},"Hand off a conversation and use Ask","\u002Fagents\u002Fconversations\u002Fhandoffs-and-ask","03.agents\u002F07.conversations\u002F04.handoffs-and-ask",{"title":269,"path":270,"stem":271,"children":272,"icon":274},"Decide an approval","\u002Fagents\u002Fapprovals","03.agents\u002F08.approvals\u002F00.index",[273,275,279,283,287,291,295],{"title":269,"path":270,"stem":271,"icon":274},"i-ph-hand-palm",{"title":276,"path":277,"stem":278},"Configure approval ownership and deadlines","\u002Fagents\u002Fapprovals\u002Fconfigure","03.agents\u002F08.approvals\u002F02.configure",{"title":280,"path":281,"stem":282},"How approval decisions bind a call","\u002Fagents\u002Fapprovals\u002Fsecurity","03.agents\u002F08.approvals\u002F03.security",{"title":284,"path":285,"stem":286},"Edit an approval or allow repeated calls","\u002Fagents\u002Fapprovals\u002Fedits-and-repeat-calls","03.agents\u002F08.approvals\u002F04.edits-and-repeat-calls",{"title":288,"path":289,"stem":290},"Resolve loop, budget and recovery waits","\u002Fagents\u002Fapprovals\u002Frecovery","03.agents\u002F08.approvals\u002F05.recovery",{"title":292,"path":293,"stem":294},"Review approval statistics and test cards","\u002Fagents\u002Fapprovals\u002Fstatistics","03.agents\u002F08.approvals\u002F06.statistics",{"title":296,"path":297,"stem":298},"Decide approvals from an app","\u002Fagents\u002Fapprovals\u002Fapps","03.agents\u002F08.approvals\u002F07.apps",{"title":300,"path":301,"stem":302,"icon":303},"Asking people","\u002Fagents\u002Fasking-people","03.agents\u002F09.asking-people","i-ph-chat-circle-dots",{"title":305,"path":306,"stem":307,"children":308,"icon":71},"Build","\u002Fbuild","04.build\u002F00.index",[309,310,655,844],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313,"children":314,"icon":71},"Plugins","\u002Fbuild\u002Fplugins","04.build\u002F01.plugins\u002F00.index",[315,316,321,352,357,362,367,378,397,412,417,422,427,442,447,452,457,472,476,481,492,497,502,640],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319,"icon":320},"What a plugin is","\u002Fbuild\u002Fplugins\u002Foverview","04.build\u002F01.plugins\u002F01.overview","i-ph-puzzle-piece",{"title":322,"path":323,"stem":324,"children":325,"icon":327},"Install a plugin","\u002Fbuild\u002Fplugins\u002Finstall","04.build\u002F01.plugins\u002F02.install\u002F00.index",[326,328,332,336,340,344,348],{"title":322,"path":323,"stem":324,"icon":327},"i-ph-package",{"title":329,"path":330,"stem":331,"icon":327},"Review an install","\u002Fbuild\u002Fplugins\u002Finstall\u002Freview","04.build\u002F01.plugins\u002F02.install\u002F01.review",{"title":333,"path":334,"stem":335,"icon":327},"Install from a source","\u002Fbuild\u002Fplugins\u002Finstall\u002Fsources","04.build\u002F01.plugins\u002F02.install\u002F02.sources",{"title":337,"path":338,"stem":339,"icon":327},"Update a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Fupdate","04.build\u002F01.plugins\u002F02.install\u002F03.update",{"title":341,"path":342,"stem":343,"icon":327},"Roll out a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Frollouts","04.build\u002F01.plugins\u002F02.install\u002F04.rollouts",{"title":345,"path":346,"stem":347,"icon":327},"Grant access between plugins","\u002Fbuild\u002Fplugins\u002Finstall\u002Fgrants","04.build\u002F01.plugins\u002F02.install\u002F05.grants",{"title":349,"path":350,"stem":351,"icon":327},"Retire or remove a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Fretire-and-remove","04.build\u002F01.plugins\u002F02.install\u002F06.retire-and-remove",{"title":353,"path":354,"stem":355,"icon":356},"Configure an installed plugin","\u002Fbuild\u002Fplugins\u002Fconfigure","04.build\u002F01.plugins\u002F03.configure","i-ph-sliders-horizontal",{"title":358,"path":359,"stem":360,"icon":361},"Sets","\u002Fbuild\u002Fplugins\u002Fsets","04.build\u002F01.plugins\u002F04.sets","i-ph-stack",{"title":363,"path":364,"stem":365,"icon":366},"Your first plugin","\u002Fbuild\u002Fplugins\u002Ffirst-plugin","04.build\u002F01.plugins\u002F05.first-plugin","i-ph-hammer",{"title":368,"path":369,"stem":370,"children":371,"icon":373},"Structure a plugin","\u002Fbuild\u002Fplugins\u002Fstructure","04.build\u002F01.plugins\u002F06.structure\u002F00.index",[372,374],{"title":368,"path":369,"stem":370,"icon":373},"i-ph-tree-structure",{"title":375,"path":376,"stem":377,"icon":373},"Plugin structure rules","\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules","04.build\u002F01.plugins\u002F06.structure\u002F01.lint-rules",{"title":379,"path":380,"stem":381,"children":382,"icon":384},"Develop a plugin","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test","04.build\u002F01.plugins\u002F07.develop-and-test\u002F00.index",[383,385,389,393],{"title":379,"path":380,"stem":381,"icon":384},"i-ph-flask",{"title":386,"path":387,"stem":388,"icon":384},"Check a plugin candidate","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Fcandidate-checks","04.build\u002F01.plugins\u002F07.develop-and-test\u002F01.candidate-checks",{"title":390,"path":391,"stem":392,"icon":384},"Lint and test a plugin","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Flint-and-tests","04.build\u002F01.plugins\u002F07.develop-and-test\u002F02.lint-and-tests",{"title":394,"path":395,"stem":396,"icon":384},"Run failure drills","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Ftests-and-drills","04.build\u002F01.plugins\u002F07.develop-and-test\u002F03.tests-and-drills",{"title":398,"path":399,"stem":400,"children":401,"icon":403},"Build in Studio","\u002Fbuild\u002Fplugins\u002Fstudio","04.build\u002F01.plugins\u002F08.studio\u002F00.index",[402,404,408],{"title":398,"path":399,"stem":400,"icon":403},"i-ph-code",{"title":405,"path":406,"stem":407,"icon":403},"Test and explain a draft","\u002Fbuild\u002Fplugins\u002Fstudio\u002Ftest-and-explain","04.build\u002F01.plugins\u002F08.studio\u002F01.test-and-explain",{"title":409,"path":410,"stem":411,"icon":403},"Release a workspace plugin","\u002Fbuild\u002Fplugins\u002Fstudio\u002Frelease","04.build\u002F01.plugins\u002F08.studio\u002F02.release",{"title":413,"path":414,"stem":415,"icon":416},"The build kit","\u002Fbuild\u002Fplugins\u002Fclaude-code","04.build\u002F01.plugins\u002F09.claude-code","i-ph-sparkle",{"title":418,"path":419,"stem":420,"icon":421},"Example: support triage","\u002Fbuild\u002Fplugins\u002Fexample-support-triage","04.build\u002F01.plugins\u002F10.example-support-triage","i-ph-lifebuoy",{"title":423,"path":424,"stem":425,"icon":426},"Publish and version","\u002Fbuild\u002Fplugins\u002Fpublish","04.build\u002F01.plugins\u002F11.publish","i-ph-tag",{"title":428,"path":429,"stem":430,"children":431,"icon":433},"List a plugin","\u002Fbuild\u002Fplugins\u002Flist-a-plugin","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F00.index",[432,434,438],{"title":428,"path":429,"stem":430,"icon":433},"i-ph-storefront",{"title":435,"path":436,"stem":437,"icon":433},"Hub review checks","\u002Fbuild\u002Fplugins\u002Flist-a-plugin\u002Freview","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F01.review",{"title":439,"path":440,"stem":441,"icon":433},"Maintain a listing","\u002Fbuild\u002Fplugins\u002Flist-a-plugin\u002Fmaintain","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F02.maintain",{"title":443,"path":444,"stem":445,"icon":446},"The catalog","\u002Fbuild\u002Fplugins\u002Fcatalog","04.build\u002F01.plugins\u002F13.catalog","i-ph-books",{"title":448,"path":449,"stem":450,"icon":451},"Folders, bundles and OCI","\u002Fbuild\u002Fplugins\u002Fsources","04.build\u002F01.plugins\u002F14.sources","i-ph-archive",{"title":453,"path":454,"stem":455,"icon":456},"The workspace","\u002Fbuild\u002Fplugins\u002Fworkspace","04.build\u002F01.plugins\u002F15.workspace","i-ph-folder-notch-open",{"title":458,"path":459,"stem":460,"children":461,"icon":463},"Use a plugin index","\u002Fbuild\u002Fplugins\u002Findexes","04.build\u002F01.plugins\u002F16.indexes\u002F00.index",[462,464,468],{"title":458,"path":459,"stem":460,"icon":463},"i-ph-seal-check",{"title":465,"path":466,"stem":467,"icon":463},"Read index version records","\u002Fbuild\u002Fplugins\u002Findexes\u002Fversion-records","04.build\u002F01.plugins\u002F16.indexes\u002F01.version-records",{"title":469,"path":470,"stem":471,"icon":463},"Manage plugin indexes","\u002Fbuild\u002Fplugins\u002Findexes\u002Fmanage","04.build\u002F01.plugins\u002F16.indexes\u002F02.manage",{"title":473,"path":474,"stem":475,"icon":327},"Existing MCP packages","\u002Fbuild\u002Fplugins\u002Fpackages","04.build\u002F01.plugins\u002F17.packages",{"title":477,"path":478,"stem":479,"icon":480},"MCP servers from container images","\u002Fbuild\u002Fplugins\u002Fcontainer-images","04.build\u002F01.plugins\u002F18.container-images","i-ph-cube",{"title":482,"path":483,"stem":484,"children":485,"icon":487},"Import agent plugins","\u002Fbuild\u002Fplugins\u002Fclaude-code-and-agent-plugins","04.build\u002F01.plugins\u002F19.claude-code-and-agent-plugins\u002F00.index",[486,488],{"title":482,"path":483,"stem":484,"icon":487},"i-ph-arrow-square-in",{"title":489,"path":490,"stem":491,"icon":487},"Import from registries","\u002Fbuild\u002Fplugins\u002Fclaude-code-and-agent-plugins\u002Fmarketplaces","04.build\u002F01.plugins\u002F19.claude-code-and-agent-plugins\u002F01.marketplaces",{"title":493,"path":494,"stem":495,"icon":496},"GitHub","\u002Fbuild\u002Fplugins\u002Fgithub","04.build\u002F01.plugins\u002F20.github","i-ph-github-logo",{"title":498,"path":499,"stem":500,"icon":501},"Known vulnerabilities","\u002Fbuild\u002Fplugins\u002Fvulnerabilities","04.build\u002F01.plugins\u002F21.vulnerabilities","i-ph-shield-warning",{"title":503,"path":504,"stem":505,"children":506,"icon":71},"Verified plugins","\u002Fbuild\u002Fplugins\u002Fverified","04.build\u002F01.plugins\u002F22.verified\u002F01.index",[507,508,513,518,523,528,533,538,543,548,553,558,580,585,589,594,599,604,608,612,617,622,626],{"title":503,"path":504,"stem":505,"icon":463},{"title":509,"path":510,"stem":511,"icon":512},"ai.oz0\u002Fweb","\u002Fbuild\u002Fplugins\u002Fverified\u002Fweb","04.build\u002F01.plugins\u002F22.verified\u002F02.web","i-ph-globe",{"title":514,"path":515,"stem":516,"icon":517},"ai.oz0\u002Fnet-diag","\u002Fbuild\u002Fplugins\u002Fverified\u002Fnet-diag","04.build\u002F01.plugins\u002F22.verified\u002F03.net-diag","i-ph-network",{"title":519,"path":520,"stem":521,"icon":522},"ai.oz0\u002Fcve-triage","\u002Fbuild\u002Fplugins\u002Fverified\u002Fcve-triage","04.build\u002F01.plugins\u002F22.verified\u002F04.cve-triage","i-ph-bug",{"title":524,"path":525,"stem":526,"icon":527},"ai.oz0\u002Fhost-health","\u002Fbuild\u002Fplugins\u002Fverified\u002Fhost-health","04.build\u002F01.plugins\u002F22.verified\u002F05.host-health","i-ph-heartbeat",{"title":529,"path":530,"stem":531,"icon":532},"ai.oz0\u002Fpr-reviewer","\u002Fbuild\u002Fplugins\u002Fverified\u002Fpr-reviewer","04.build\u002F01.plugins\u002F22.verified\u002F06.pr-reviewer","i-ph-git-pull-request",{"title":534,"path":535,"stem":536,"icon":537},"Slack","\u002Fbuild\u002Fplugins\u002Fverified\u002Fslack","04.build\u002F01.plugins\u002F22.verified\u002F07.slack","i-ph-slack-logo",{"title":539,"path":540,"stem":541,"icon":542},"Discord","\u002Fbuild\u002Fplugins\u002Fverified\u002Fdiscord","04.build\u002F01.plugins\u002F22.verified\u002F08.discord","i-ph-discord-logo",{"title":544,"path":545,"stem":546,"icon":547},"Microsoft Teams","\u002Fbuild\u002Fplugins\u002Fverified\u002Fteams","04.build\u002F01.plugins\u002F22.verified\u002F09.teams","i-ph-microsoft-teams-logo",{"title":549,"path":550,"stem":551,"icon":552},"ai.oz0\u002Fai-spend","\u002Fbuild\u002Fplugins\u002Fverified\u002Fai-spend","04.build\u002F01.plugins\u002F22.verified\u002F10.ai-spend","i-ph-coins",{"title":554,"path":555,"stem":556,"icon":557},"ai.oz0\u002Fa2a-remote","\u002Fbuild\u002Fplugins\u002Fverified\u002Fa2a-remote","04.build\u002F01.plugins\u002F22.verified\u002F11.a2a-remote","i-ph-arrows-left-right",{"title":559,"path":560,"stem":561,"children":562,"icon":98},"Guardrails","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F00.index",[563,564,568,572,576],{"title":559,"path":560,"stem":561,"icon":98},{"title":565,"path":566,"stem":567,"icon":98},"Configure guardrails","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fsettings","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F01.settings",{"title":569,"path":570,"stem":571,"icon":98},"Check classified text","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fclassified-text","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F02.classified-text",{"title":573,"path":574,"stem":575,"icon":98},"Check shell commands","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fcommands","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F03.commands",{"title":577,"path":578,"stem":579,"icon":98},"Guardrail coverage and limits","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fintent-and-limits","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F04.intent-and-limits",{"title":581,"path":582,"stem":583,"icon":584},"ai.oz0\u002Fmemory","\u002Fbuild\u002Fplugins\u002Fverified\u002Fmemory","04.build\u002F01.plugins\u002F22.verified\u002F13.memory","i-ph-brain",{"title":586,"path":587,"stem":588,"icon":416},"ai.oz0\u002Fsetup-assistant","\u002Fbuild\u002Fplugins\u002Fverified\u002Fsetup-assistant","04.build\u002F01.plugins\u002F22.verified\u002F14.setup-assistant",{"title":590,"path":591,"stem":592,"icon":593},"ai.oz0\u002Fpublic-access","\u002Fbuild\u002Fplugins\u002Fverified\u002Fpublic-access","04.build\u002F01.plugins\u002F22.verified\u002F15.public-access","i-ph-files",{"title":595,"path":596,"stem":597,"icon":598},"ai.oz0\u002Femail","\u002Fbuild\u002Fplugins\u002Fverified\u002Femail","04.build\u002F01.plugins\u002F22.verified\u002F16.email","i-ph-envelope-simple",{"title":600,"path":601,"stem":602,"icon":603},"Atlassian Cloud","\u002Fbuild\u002Fplugins\u002Fverified\u002Fatlassian","04.build\u002F01.plugins\u002F22.verified\u002F17.atlassian","i-ph-kanban",{"title":605,"path":606,"stem":607,"icon":603},"Atlassian Data Center","\u002Fbuild\u002Fplugins\u002Fverified\u002Fatlassian-dc","04.build\u002F01.plugins\u002F22.verified\u002F18.atlassian-dc",{"title":609,"path":610,"stem":611,"icon":421},"ServiceNow","\u002Fbuild\u002Fplugins\u002Fverified\u002Fservicenow","04.build\u002F01.plugins\u002F22.verified\u002F19.servicenow",{"title":613,"path":614,"stem":615,"icon":616},"GitLab","\u002Fbuild\u002Fplugins\u002Fverified\u002Fgitlab","04.build\u002F01.plugins\u002F22.verified\u002F20.gitlab","i-ph-git-merge",{"title":618,"path":619,"stem":620,"icon":621},"Support triage","\u002Fbuild\u002Fplugins\u002Fverified\u002Fsupport-triage","04.build\u002F01.plugins\u002F22.verified\u002F21.support-triage","i-ph-ticket",{"title":623,"path":624,"stem":625,"icon":361},"Essentials","\u002Fbuild\u002Fplugins\u002Fverified\u002Fessentials","04.build\u002F01.plugins\u002F22.verified\u002F22.essentials",{"title":627,"path":628,"stem":629,"children":630,"icon":532},"Plugin improver","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F00.index",[631,632,636],{"title":627,"path":628,"stem":629,"icon":532},{"title":633,"path":634,"stem":635,"icon":532},"How an improvement runs","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver\u002Fjob-lifecycle","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F01.job-lifecycle",{"title":637,"path":638,"stem":639,"icon":532},"Improver limits and records","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver\u002Flimits-and-records","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F02.limits-and-records",{"title":641,"path":642,"stem":643,"children":644,"icon":646},"Plugin size limits","\u002Fbuild\u002Fplugins\u002Flimits","04.build\u002F01.plugins\u002F23.limits\u002F00.index",[645,647,651],{"title":641,"path":642,"stem":643,"icon":646},"i-ph-ruler",{"title":648,"path":649,"stem":650,"icon":646},"Documentation limits","\u002Fbuild\u002Fplugins\u002Flimits\u002Fdocumentation","04.build\u002F01.plugins\u002F23.limits\u002F01.documentation",{"title":652,"path":653,"stem":654,"icon":646},"Artifact and index limits","\u002Fbuild\u002Fplugins\u002Flimits\u002Fartifacts","04.build\u002F01.plugins\u002F23.limits\u002F02.artifacts",{"title":656,"path":657,"stem":658,"children":659,"icon":71},"Parts","\u002Fbuild\u002Fparts","04.build\u002F02.parts\u002F00.index",[660,662,667,672,690,721,726,730,741,756,761,776,791,814,818,823,828,839],{"title":661,"path":657,"stem":658},"Plugin parts",{"title":663,"path":664,"stem":665,"icon":666},"Agents","\u002Fbuild\u002Fparts\u002Fagents","04.build\u002F02.parts\u002F01.agents","i-ph-robot",{"title":668,"path":669,"stem":670,"icon":671},"What an agent combines","\u002Fbuild\u002Fparts\u002Fwhat-an-agent-combines","04.build\u002F02.parts\u002F02.what-an-agent-combines","i-ph-intersect-three",{"title":673,"path":674,"stem":675,"children":676,"icon":646},"Agent contracts","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F00.index",[677,678,682,686],{"title":673,"path":674,"stem":675,"icon":646},{"title":679,"path":680,"stem":681,"icon":646},"Agent failure kinds","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Ffailures","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F01.failures",{"title":683,"path":684,"stem":685,"icon":646},"Agent limits","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Flimits","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F02.limits",{"title":687,"path":688,"stem":689,"icon":646},"Agent budgets","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Fbudgets","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F03.budgets",{"title":691,"path":692,"stem":693,"children":694,"icon":696},"Write a tool","\u002Fbuild\u002Fparts\u002Ftools","04.build\u002F02.parts\u002F04.tools\u002F00.index",[695,697,701,705,709,713,717],{"title":691,"path":692,"stem":693,"icon":696},"i-ph-wrench",{"title":698,"path":699,"stem":700,"icon":696},"Describe tool functions","\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions","04.build\u002F02.parts\u002F04.tools\u002F01.definitions",{"title":702,"path":703,"stem":704,"icon":696},"Return results and files","\u002Fbuild\u002Fparts\u002Ftools\u002Fresults-and-files","04.build\u002F02.parts\u002F04.tools\u002F02.results-and-files",{"title":706,"path":707,"stem":708,"icon":696},"Handle tool call lifecycle","\u002Fbuild\u002Fparts\u002Ftools\u002Fcall-lifecycle","04.build\u002F02.parts\u002F04.tools\u002F03.call-lifecycle",{"title":710,"path":711,"stem":712,"icon":696},"Pin tool definitions","\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots","04.build\u002F02.parts\u002F04.tools\u002F04.snapshots",{"title":714,"path":715,"stem":716,"icon":696},"Call a model from a tool","\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls","04.build\u002F02.parts\u002F04.tools\u002F05.model-calls",{"title":718,"path":719,"stem":720,"icon":696},"Tool labels and approvals","\u002Fbuild\u002Fparts\u002Ftools\u002Fpolicy","04.build\u002F02.parts\u002F04.tools\u002F06.policy",{"title":722,"path":723,"stem":724,"icon":725},"TypeScript tools","\u002Fbuild\u002Fparts\u002Ftypescript-tools","04.build\u002F02.parts\u002F05.typescript-tools","i-ph-file-code",{"title":727,"path":728,"stem":729,"icon":725},"Import an OpenAPI document","\u002Fbuild\u002Fparts\u002Fopenapi-import","04.build\u002F02.parts\u002F06.openapi-import",{"title":731,"path":732,"stem":733,"children":734,"icon":736},"Write and load skills","\u002Fbuild\u002Fparts\u002Fskills","04.build\u002F02.parts\u002F07.skills\u002F00.index",[735,737],{"title":731,"path":732,"stem":733,"icon":736},"i-ph-graduation-cap",{"title":738,"path":739,"stem":740,"icon":736},"Review skill use and proposals","\u002Fbuild\u002Fparts\u002Fskills\u002Fusage-and-proposals","04.build\u002F02.parts\u002F07.skills\u002F01.usage-and-proposals",{"title":742,"path":743,"stem":744,"children":745,"icon":747},"Write a flow","\u002Fbuild\u002Fparts\u002Fflows","04.build\u002F02.parts\u002F08.flows\u002F00.index",[746,748,752],{"title":742,"path":743,"stem":744,"icon":747},"i-ph-flow-arrow",{"title":749,"path":750,"stem":751,"icon":747},"Flow steps and expressions","\u002Fbuild\u002Fparts\u002Fflows\u002Fsteps-and-expressions","04.build\u002F02.parts\u002F08.flows\u002F01.steps-and-expressions",{"title":753,"path":754,"stem":755,"icon":747},"Expose and explain flows","\u002Fbuild\u002Fparts\u002Fflows\u002Fflow-tools","04.build\u002F02.parts\u002F08.flows\u002F02.flow-tools",{"title":757,"path":758,"stem":759,"icon":760},"Hooks","\u002Fbuild\u002Fparts\u002Fhooks","04.build\u002F02.parts\u002F09.hooks","i-ph-anchor",{"title":762,"path":763,"stem":764,"children":765,"icon":767},"Declare an event source","\u002Fbuild\u002Fparts\u002Fevent-sources","04.build\u002F02.parts\u002F10.event-sources\u002F00.index",[766,768,772],{"title":762,"path":763,"stem":764,"icon":767},"i-ph-broadcast",{"title":769,"path":770,"stem":771,"icon":767},"Bind and answer deliveries","\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding","04.build\u002F02.parts\u002F10.event-sources\u002F01.delivery-binding",{"title":773,"path":774,"stem":775,"icon":767},"Use platform events","\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fplatform-events","04.build\u002F02.parts\u002F10.event-sources\u002F02.platform-events",{"title":777,"path":778,"stem":779,"children":780,"icon":782},"Declare a connection","\u002Fbuild\u002Fparts\u002Fconnections","04.build\u002F02.parts\u002F11.connections\u002F00.index",[781,783,787],{"title":777,"path":778,"stem":779,"icon":782},"i-ph-plugs-connected",{"title":784,"path":785,"stem":786,"icon":782},"Connection token lifecycle","\u002Fbuild\u002Fparts\u002Fconnections\u002Ftoken-lifecycle","04.build\u002F02.parts\u002F11.connections\u002F01.token-lifecycle",{"title":788,"path":789,"stem":790,"icon":782},"Connection setup and security","\u002Fbuild\u002Fparts\u002Fconnections\u002Fsetup-and-security","04.build\u002F02.parts\u002F11.connections\u002F02.setup-and-security",{"title":792,"path":793,"stem":794,"children":795,"icon":797},"Choose a harness","\u002Fbuild\u002Fparts\u002Fharnesses","04.build\u002F02.parts\u002F12.harnesses\u002F00.index",[796,798,802,806,810],{"title":792,"path":793,"stem":794,"icon":797},"i-ph-cpu",{"title":799,"path":800,"stem":801,"icon":797},"Harness tool controls","\u002Fbuild\u002Fparts\u002Fharnesses\u002Ftool-controls","04.build\u002F02.parts\u002F12.harnesses\u002F01.tool-controls",{"title":803,"path":804,"stem":805,"icon":797},"Recover a harness session","\u002Fbuild\u002Fparts\u002Fharnesses\u002Frecovery","04.build\u002F02.parts\u002F12.harnesses\u002F02.recovery",{"title":807,"path":808,"stem":809,"icon":797},"Write a harness","\u002Fbuild\u002Fparts\u002Fharnesses\u002Fcustom-harnesses","04.build\u002F02.parts\u002F12.harnesses\u002F03.custom-harnesses",{"title":811,"path":812,"stem":813,"icon":797},"Use an ACP agent","\u002Fbuild\u002Fparts\u002Fharnesses\u002Facp","04.build\u002F02.parts\u002F12.harnesses\u002F04.acp",{"title":815,"path":816,"stem":817,"icon":782},"Bring your own agent","\u002Fbuild\u002Fparts\u002Fbring-your-own-agent","04.build\u002F02.parts\u002F13.bring-your-own-agent",{"title":819,"path":820,"stem":821,"icon":822},"Records and start-up text","\u002Fbuild\u002Fparts\u002Frecords-and-startup","04.build\u002F02.parts\u002F14.records-and-startup","i-ph-database",{"title":824,"path":825,"stem":826,"icon":827},"Addresses","\u002Fbuild\u002Fparts\u002Faddresses","04.build\u002F02.parts\u002F15.addresses","i-ph-signpost",{"title":829,"path":830,"stem":831,"children":832,"icon":834},"Define a routine","\u002Fbuild\u002Fparts\u002Froutines","04.build\u002F02.parts\u002F16.routines\u002F00.index",[833,835],{"title":829,"path":830,"stem":831,"icon":834},"i-ph-clock-clockwise",{"title":836,"path":837,"stem":838,"icon":834},"Routine permissions and outputs","\u002Fbuild\u002Fparts\u002Froutines\u002Foutputs-and-permissions","04.build\u002F02.parts\u002F16.routines\u002F01.outputs-and-permissions",{"title":840,"path":841,"stem":842,"icon":843},"When to split an agent","\u002Fbuild\u002Fparts\u002Fwhen-to-split-an-agent","04.build\u002F02.parts\u002F17.when-to-split-an-agent","i-ph-arrows-split",{"title":845,"path":846,"stem":847,"children":848,"icon":71},"Apps on OZ","\u002Fbuild\u002Fapps","04.build\u002F03.apps\u002F00.index",[849,851,862,867,872,876,880,884,894,908,913,928,942],{"title":850,"path":846,"stem":847},"Applications and clients",{"title":852,"path":853,"stem":854,"children":855,"icon":857},"Use the runtime API","\u002Fbuild\u002Fapps\u002Fruntime-api","04.build\u002F03.apps\u002F01.runtime-api\u002F00.index",[856,858],{"title":852,"path":853,"stem":854,"icon":857},"i-ph-plug",{"title":859,"path":860,"stem":861,"icon":857},"Runtime API authentication","\u002Fbuild\u002Fapps\u002Fruntime-api\u002Fauthentication","04.build\u002F03.apps\u002F01.runtime-api\u002F01.authentication",{"title":863,"path":864,"stem":865,"icon":866},"Python SDK","\u002Fbuild\u002Fapps\u002Fsdk-python","04.build\u002F03.apps\u002F02.sdk-python","i-ph-file-py",{"title":868,"path":869,"stem":870,"icon":871},"TypeScript SDK","\u002Fbuild\u002Fapps\u002Fsdk-typescript","04.build\u002F03.apps\u002F03.sdk-typescript","i-ph-file-ts",{"title":873,"path":874,"stem":875,"icon":725},"Go SDK","\u002Fbuild\u002Fapps\u002Fsdk-go","04.build\u002F03.apps\u002F04.sdk-go",{"title":877,"path":878,"stem":879,"icon":782},"AG-UI for your apps","\u002Fbuild\u002Fapps\u002Fag-ui","04.build\u002F03.apps\u002F05.ag-ui",{"title":881,"path":882,"stem":883,"icon":249},"A chat in your own app","\u002Fbuild\u002Fapps\u002Fchat-app","04.build\u002F03.apps\u002F06.chat-app",{"title":885,"path":886,"stem":887,"children":888,"icon":767},"Follow live jobs","\u002Fbuild\u002Fapps\u002Flive-feeds","04.build\u002F03.apps\u002F07.live-feeds\u002F00.index",[889,890],{"title":885,"path":886,"stem":887,"icon":767},{"title":891,"path":892,"stem":893,"icon":767},"Feed access and browser streams","\u002Fbuild\u002Fapps\u002Flive-feeds\u002Fbrowser-and-access","04.build\u002F03.apps\u002F07.live-feeds\u002F01.browser-and-access",{"title":895,"path":896,"stem":897,"children":898,"icon":782},"Call agents over MCP","\u002Fbuild\u002Fapps\u002Fmcp-server","04.build\u002F03.apps\u002F08.mcp-server\u002F00.index",[899,900,904],{"title":895,"path":896,"stem":897,"icon":782},{"title":901,"path":902,"stem":903,"icon":782},"MCP client OAuth","\u002Fbuild\u002Fapps\u002Fmcp-server\u002Foauth","04.build\u002F03.apps\u002F08.mcp-server\u002F01.oauth",{"title":905,"path":906,"stem":907,"icon":782},"MCP security and limits","\u002Fbuild\u002Fapps\u002Fmcp-server\u002Fsecurity-and-limits","04.build\u002F03.apps\u002F08.mcp-server\u002F02.security-and-limits",{"title":909,"path":910,"stem":911,"icon":912},"A2A agents","\u002Fbuild\u002Fapps\u002Fa2a","04.build\u002F03.apps\u002F09.a2a","i-ph-share-network",{"title":914,"path":915,"stem":916,"children":917,"icon":919},"Run a remote agent","\u002Fbuild\u002Fapps\u002Fremote-agents","04.build\u002F03.apps\u002F10.remote-agents\u002F00.index",[918,920,924],{"title":914,"path":915,"stem":916,"icon":919},"i-ph-cloud-arrow-down",{"title":921,"path":922,"stem":923,"icon":919},"Remote sessions and limits","\u002Fbuild\u002Fapps\u002Fremote-agents\u002Fsessions-and-limits","04.build\u002F03.apps\u002F10.remote-agents\u002F01.sessions-and-limits",{"title":925,"path":926,"stem":927,"icon":919},"Connect an outside A2A agent","\u002Fbuild\u002Fapps\u002Fremote-agents\u002Fa2a","04.build\u002F03.apps\u002F10.remote-agents\u002F02.a2a",{"title":929,"path":930,"stem":931,"children":932,"icon":249},"Connect a chat channel","\u002Fbuild\u002Fapps\u002Fchat-channels","04.build\u002F03.apps\u002F11.chat-channels\u002F00.index",[933,934,938],{"title":929,"path":930,"stem":931,"icon":249},{"title":935,"path":936,"stem":937,"icon":249},"Chat channel conversations","\u002Fbuild\u002Fapps\u002Fchat-channels\u002Fconversations","04.build\u002F03.apps\u002F11.chat-channels\u002F01.conversations",{"title":939,"path":940,"stem":941,"icon":249},"Build a chat channel","\u002Fbuild\u002Fapps\u002Fchat-channels\u002Fbuild","04.build\u002F03.apps\u002F11.chat-channels\u002F02.build",{"title":943,"path":944,"stem":945,"icon":946},"Interop matrix","\u002Fbuild\u002Fapps\u002Finterop","04.build\u002F03.apps\u002F12.interop","i-ph-check-square-offset",{"title":948,"path":949,"stem":950,"children":951,"icon":71},"Improve","\u002Fimprove","05.improve\u002F00.index",[952,953,958,963,968,994,1021,1026,1031,1036],{"title":948,"path":949,"stem":950},{"title":954,"path":955,"stem":956,"icon":957},"Search, compare and fix","\u002Fimprove\u002Fsearch-and-compare","05.improve\u002F01.search-and-compare","i-ph-magnifying-glass",{"title":959,"path":960,"stem":961,"icon":962},"Errors and insights","\u002Fimprove\u002Ferrors-and-insights","05.improve\u002F02.errors-and-insights","i-ph-chart-line",{"title":964,"path":965,"stem":966,"icon":967},"Measured savings","\u002Fimprove\u002Fmeasured-savings","05.improve\u002F03.measured-savings","i-ph-scales",{"title":969,"path":970,"stem":971,"children":972,"icon":463},"Evals and quality gates","\u002Fimprove\u002Fevals","05.improve\u002F04.evals\u002F00.index",[973,974,978,982,986,990],{"title":969,"path":970,"stem":971,"icon":463},{"title":975,"path":976,"stem":977},"Case expectations","\u002Fimprove\u002Fevals\u002Fcases","05.improve\u002F04.evals\u002F01.cases",{"title":979,"path":980,"stem":981},"Record and replay answers","\u002Fimprove\u002Fevals\u002Frecordings","05.improve\u002F04.evals\u002F02.recordings",{"title":983,"path":984,"stem":985},"Check policy paths","\u002Fimprove\u002Fevals\u002Fcoverage","05.improve\u002F04.evals\u002F03.coverage",{"title":987,"path":988,"stem":989},"Gate a plugin update","\u002Fimprove\u002Fevals\u002Fquality-gates","05.improve\u002F04.evals\u002F04.quality-gates",{"title":991,"path":992,"stem":993},"Track quality and regressions","\u002Fimprove\u002Fevals\u002Fregressions","05.improve\u002F04.evals\u002F05.regressions",{"title":995,"path":996,"stem":997,"children":998,"icon":1000},"Outcome checks and patterns","\u002Fimprove\u002Foutcome-checks","05.improve\u002F05.outcome-checks\u002F00.index",[999,1001,1005,1009,1013,1017],{"title":995,"path":996,"stem":997,"icon":1000},"i-ph-gavel",{"title":1002,"path":1003,"stem":1004},"Choose a judge and rubric","\u002Fimprove\u002Foutcome-checks\u002Fjudges","05.improve\u002F05.outcome-checks\u002F01.judges",{"title":1006,"path":1007,"stem":1008},"Measure a judge over time","\u002Fimprove\u002Foutcome-checks\u002Fsampling","05.improve\u002F05.outcome-checks\u002F02.sampling",{"title":1010,"path":1011,"stem":1012},"Use a reviewer agent","\u002Fimprove\u002Foutcome-checks\u002Freviewer","05.improve\u002F05.outcome-checks\u002F03.reviewer",{"title":1014,"path":1015,"stem":1016},"Choose among candidate answers","\u002Fimprove\u002Foutcome-checks\u002Fselection","05.improve\u002F05.outcome-checks\u002F04.selection",{"title":1018,"path":1019,"stem":1020},"Test and roll out judged agents","\u002Fimprove\u002Foutcome-checks\u002Frollouts","05.improve\u002F05.outcome-checks\u002F05.rollouts",{"title":1022,"path":1023,"stem":1024,"icon":1025},"Measured results","\u002Fimprove\u002Fmeasured-results","05.improve\u002F06.measured-results","i-ph-chart-bar",{"title":1027,"path":1028,"stem":1029,"icon":1030},"Comparisons of a changed agent","\u002Fimprove\u002Fcomparisons-of-a-changed-agent","05.improve\u002F07.comparisons-of-a-changed-agent","i-ph-git-diff",{"title":1032,"path":1033,"stem":1034,"icon":1035},"Where a fix belongs","\u002Fimprove\u002Fwhere-a-fix-belongs","05.improve\u002F08.where-a-fix-belongs","i-ph-ladder",{"title":1037,"path":1038,"stem":1039,"icon":957},"Evidence for agents","\u002Fimprove\u002Fevidence-for-agents","05.improve\u002F09.evidence-for-agents",{"title":1041,"path":1042,"stem":1043,"children":1044,"icon":71},"Govern","\u002Fgovern","06.govern\u002F00.index",[1045,1047,1085,1089,1111,1115,1120,1151,1170,1175,1180,1184,1207],{"title":1046,"path":1042,"stem":1043},"Govern agents",{"title":1048,"path":1049,"stem":1050,"children":1051,"icon":98},"Tool policy","\u002Fgovern\u002Ftool-policy","06.govern\u002F01.tool-policy\u002F00.index",[1052,1053,1057,1061,1065,1069,1073,1077,1081],{"title":1048,"path":1049,"stem":1050,"icon":98},{"title":1054,"path":1055,"stem":1056},"Export and apply a tool policy","\u002Fgovern\u002Ftool-policy\u002Ffiles","06.govern\u002F01.tool-policy\u002F02.files",{"title":1058,"path":1059,"stem":1060},"Rules for plugin and remote functions","\u002Fgovern\u002Ftool-policy\u002Fplugin-functions","06.govern\u002F01.tool-policy\u002F03.plugin-functions",{"title":1062,"path":1063,"stem":1064},"Function conditions and action classes","\u002Fgovern\u002Ftool-policy\u002Fconditions","06.govern\u002F01.tool-policy\u002F04.conditions",{"title":1066,"path":1067,"stem":1068},"Rules for taint, origins and sequences","\u002Fgovern\u002Ftool-policy\u002Forigins-and-sequences","06.govern\u002F01.tool-policy\u002F05.origins-and-sequences",{"title":1070,"path":1071,"stem":1072},"How the runtime enforces tool policy","\u002Fgovern\u002Ftool-policy\u002Fruntime","06.govern\u002F01.tool-policy\u002F06.runtime",{"title":1074,"path":1075,"stem":1076},"Preview, review and lint tool policy changes","\u002Fgovern\u002Ftool-policy\u002Freview-changes","06.govern\u002F01.tool-policy\u002F07.review-changes",{"title":1078,"path":1079,"stem":1080},"Assign duties to tool calls","\u002Fgovern\u002Ftool-policy\u002Fduties","06.govern\u002F01.tool-policy\u002F08.duties",{"title":1082,"path":1083,"stem":1084},"Command rules in a tool policy","\u002Fgovern\u002Ftool-policy\u002Fcommand-rules","06.govern\u002F01.tool-policy\u002F09.command-rules",{"title":1086,"path":1087,"stem":1088,"icon":230},"Governance replay","\u002Fgovern\u002Fgovernance-replay","06.govern\u002F02.governance-replay",{"title":1090,"path":1091,"stem":1092,"children":1093,"icon":532},"Reviewed changes","\u002Fgovern\u002Freviewed-changes","06.govern\u002F03.reviewed-changes\u002F00.index",[1094,1095,1099,1103,1107],{"title":1090,"path":1091,"stem":1092,"icon":532},{"title":1096,"path":1097,"stem":1098},"Review assistant and job proposals","\u002Fgovern\u002Freviewed-changes\u002Fproposals","06.govern\u002F03.reviewed-changes\u002F02.proposals",{"title":1100,"path":1101,"stem":1102},"Review plugin configurations","\u002Fgovern\u002Freviewed-changes\u002Fplugin-configurations","06.govern\u002F03.reviewed-changes\u002F03.plugin-configurations",{"title":1104,"path":1105,"stem":1106},"Review and roll back changesets","\u002Fgovern\u002Freviewed-changes\u002Fchangesets","06.govern\u002F03.reviewed-changes\u002F04.changesets",{"title":1108,"path":1109,"stem":1110},"Review changes to protected paths","\u002Fgovern\u002Freviewed-changes\u002Fprotected-paths","06.govern\u002F03.reviewed-changes\u002F05.protected-paths",{"title":1112,"path":1113,"stem":1114,"icon":666},"AI labels","\u002Fgovern\u002Fai-labels","06.govern\u002F04.ai-labels",{"title":1116,"path":1117,"stem":1118,"icon":1119},"Kill switches","\u002Fgovern\u002Fkill-switches","06.govern\u002F05.kill-switches","i-ph-power",{"title":1121,"path":1122,"stem":1123,"children":1124,"icon":1126},"Personal data","\u002Fgovern\u002Fpersonal-data","06.govern\u002F06.personal-data\u002F00.index",[1125,1127,1131,1135,1139,1143,1147],{"title":1121,"path":1122,"stem":1123,"icon":1126},"i-ph-user-minus",{"title":1128,"path":1129,"stem":1130},"Associate people and purposes with jobs","\u002Fgovern\u002Fpersonal-data\u002Fassociate-people","06.govern\u002F06.personal-data\u002F01.associate-people",{"title":1132,"path":1133,"stem":1134},"Find and export personal data","\u002Fgovern\u002Fpersonal-data\u002Fexport","06.govern\u002F06.personal-data\u002F02.export",{"title":1136,"path":1137,"stem":1138},"Restrict processing and record contests","\u002Fgovern\u002Fpersonal-data\u002Frestrictions-and-contests","06.govern\u002F06.personal-data\u002F03.restrictions-and-contests",{"title":1140,"path":1141,"stem":1142},"Erase personal data","\u002Fgovern\u002Fpersonal-data\u002Ferase","06.govern\u002F06.personal-data\u002F04.erase",{"title":1144,"path":1145,"stem":1146},"Retain records and restore backups","\u002Fgovern\u002Fpersonal-data\u002Fretention","06.govern\u002F06.personal-data\u002F05.retention",{"title":1148,"path":1149,"stem":1150},"Personal data held by plugins","\u002Fgovern\u002Fpersonal-data\u002Fplugin-records","06.govern\u002F06.personal-data\u002F06.plugin-records",{"title":1152,"path":1153,"stem":1154,"children":1155,"icon":1157},"Taint and labels","\u002Fgovern\u002Ftaint-and-labels","06.govern\u002F07.taint-and-labels\u002F00.index",[1156,1158,1162,1166],{"title":1152,"path":1153,"stem":1154,"icon":1157},"i-ph-drop-half-bottom",{"title":1159,"path":1160,"stem":1161},"Set rules on taint and labels","\u002Fgovern\u002Ftaint-and-labels\u002Frules","06.govern\u002F07.taint-and-labels\u002F02.rules",{"title":1163,"path":1164,"stem":1165},"Set clearance, egress and content walls","\u002Fgovern\u002Ftaint-and-labels\u002Flabel-policies","06.govern\u002F07.taint-and-labels\u002F03.label-policies",{"title":1167,"path":1168,"stem":1169},"Read outside text in a quarantine child","\u002Fgovern\u002Ftaint-and-labels\u002Fquarantine","06.govern\u002F07.taint-and-labels\u002F04.quarantine",{"title":1171,"path":1172,"stem":1173,"icon":1174},"Works-council mode","\u002Fgovern\u002Fworks-council-mode","06.govern\u002F08.works-council-mode","i-ph-users-three",{"title":1176,"path":1177,"stem":1178,"icon":1179},"Incidents","\u002Fgovern\u002Fincidents","06.govern\u002F09.incidents","i-ph-siren",{"title":1181,"path":1182,"stem":1183,"icon":213},"Inventory","\u002Fgovern\u002Finventory","06.govern\u002F10.inventory",{"title":1185,"path":1186,"stem":1187,"children":1188,"icon":1190},"Audit trail","\u002Fgovern\u002Faudit-trail","06.govern\u002F11.audit-trail\u002F00.index",[1189,1191,1195,1199,1203],{"title":1185,"path":1186,"stem":1187,"icon":1190},"i-ph-scroll",{"title":1192,"path":1193,"stem":1194},"Audit records and run identity","\u002Fgovern\u002Faudit-trail\u002Frecords","06.govern\u002F11.audit-trail\u002F02.records",{"title":1196,"path":1197,"stem":1198},"Verify the audit chain","\u002Fgovern\u002Faudit-trail\u002Fverification","06.govern\u002F11.audit-trail\u002F03.verification",{"title":1200,"path":1201,"stem":1202},"Export and verify evidence bundles","\u002Fgovern\u002Faudit-trail\u002Fevidence-bundles","06.govern\u002F11.audit-trail\u002F04.evidence-bundles",{"title":1204,"path":1205,"stem":1206},"Audit retention, erasure and legal holds","\u002Fgovern\u002Faudit-trail\u002Fretention","06.govern\u002F11.audit-trail\u002F05.retention",{"title":1208,"path":1209,"stem":1210,"children":1211,"icon":1213},"Command rules","\u002Fgovern\u002Fcommand-rules","06.govern\u002F12.command-rules\u002F00.index",[1212,1214,1218,1222,1226],{"title":1208,"path":1209,"stem":1210,"icon":1213},"i-ph-terminal",{"title":1215,"path":1216,"stem":1217},"Command rule patterns","\u002Fgovern\u002Fcommand-rules\u002Fpatterns","06.govern\u002F12.command-rules\u002F02.patterns",{"title":1219,"path":1220,"stem":1221},"What the command reader understands","\u002Fgovern\u002Fcommand-rules\u002Fcommand-reader","06.govern\u002F12.command-rules\u002F03.command-reader",{"title":1223,"path":1224,"stem":1225},"Create a command rule from an approval","\u002Fgovern\u002Fcommand-rules\u002Fallow-from-card","06.govern\u002F12.command-rules\u002F04.allow-from-card",{"title":1227,"path":1228,"stem":1229},"Command rule evaluation and limits","\u002Fgovern\u002Fcommand-rules\u002Fevaluation-and-limits","06.govern\u002F12.command-rules\u002F05.evaluation-and-limits",{"title":1231,"path":1232,"stem":1233,"children":1234,"icon":71},"Fleet","\u002Ffleet","07.fleet\u002F00.index",[1235,1237,1242,1247,1251,1256,1260,1265,1270,1274,1278,1297,1302,1307,1325,1329,1333,1352,1357,1380,1385,1390,1395,1399,1458,1462,1467,1481,1486,1490,1494],{"title":1236,"path":1232,"stem":1233},"Operate a fleet",{"title":1238,"path":1239,"stem":1240,"icon":1241},"Dev mode","\u002Ffleet\u002Fdev-mode","07.fleet\u002F01.dev-mode","i-ph-laptop",{"title":1243,"path":1244,"stem":1245,"icon":1246},"Run a cluster","\u002Ffleet\u002Fcluster","07.fleet\u002F02.cluster","i-ph-hard-drives",{"title":1248,"path":1249,"stem":1250,"icon":782},"Join nodes","\u002Ffleet\u002Fjoin-nodes","07.fleet\u002F03.join-nodes",{"title":1252,"path":1253,"stem":1254,"icon":1255},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","07.fleet\u002F04.manage-nodes","i-ph-list-bullets",{"title":1257,"path":1258,"stem":1259,"icon":527},"Node health","\u002Ffleet\u002Fnodes","07.fleet\u002F05.nodes",{"title":1261,"path":1262,"stem":1263,"icon":1264},"Nodes as services","\u002Ffleet\u002Fservices","07.fleet\u002F06.services","i-ph-gear-six",{"title":1266,"path":1267,"stem":1268,"icon":1269},"Doctor","\u002Ffleet\u002Fdoctor","07.fleet\u002F07.doctor","i-ph-stethoscope",{"title":1271,"path":1272,"stem":1273,"icon":421},"Troubleshooting","\u002Ffleet\u002Ftroubleshooting","07.fleet\u002F08.troubleshooting",{"title":1275,"path":1276,"stem":1277,"icon":962},"Tracing and metrics","\u002Ffleet\u002Fobservability","07.fleet\u002F09.observability",{"title":1279,"path":1280,"stem":1281,"children":1282,"icon":1284},"Choose sandbox tier 2","\u002Ffleet\u002Fsandbox-tier-2","07.fleet\u002F10.sandbox-tier-2\u002F00.index",[1283,1285,1289,1293],{"title":1279,"path":1280,"stem":1281,"icon":1284},"i-ph-shield-chevron",{"title":1286,"path":1287,"stem":1288,"icon":1284},"Set up gVisor","\u002Ffleet\u002Fsandbox-tier-2\u002Fgvisor","07.fleet\u002F10.sandbox-tier-2\u002F01.gvisor",{"title":1290,"path":1291,"stem":1292,"icon":1284},"Set up microVM isolation","\u002Ffleet\u002Fsandbox-tier-2\u002Fmicrovms","07.fleet\u002F10.sandbox-tier-2\u002F02.microvms",{"title":1294,"path":1295,"stem":1296,"icon":1284},"Configure remote sandboxes","\u002Ffleet\u002Fsandbox-tier-2\u002Fremote","07.fleet\u002F10.sandbox-tier-2\u002F03.remote",{"title":1298,"path":1299,"stem":1300,"icon":1301},"Sandbox on macOS","\u002Ffleet\u002Fsandbox-on-macos","07.fleet\u002F11.sandbox-on-macos","i-ph-apple-logo",{"title":1303,"path":1304,"stem":1305,"icon":1306},"Sandbox on Windows","\u002Ffleet\u002Fsandbox-on-windows","07.fleet\u002F12.sandbox-on-windows","i-ph-windows-logo",{"title":1308,"path":1309,"stem":1310,"children":1311,"icon":797},"Configure local models","\u002Ffleet\u002Flocal-models","07.fleet\u002F13.local-models\u002F00.index",[1312,1313,1317,1321],{"title":1308,"path":1309,"stem":1310,"icon":797},{"title":1314,"path":1315,"stem":1316,"icon":797},"Share a local model with the fleet","\u002Ffleet\u002Flocal-models\u002Ffleet","07.fleet\u002F13.local-models\u002F01.fleet",{"title":1318,"path":1319,"stem":1320,"icon":797},"Review local-model safety checks","\u002Ffleet\u002Flocal-models\u002Ftrust","07.fleet\u002F13.local-models\u002F02.trust",{"title":1322,"path":1323,"stem":1324,"icon":797},"Size and price local models","\u002Ffleet\u002Flocal-models\u002Fsizing-and-cost","07.fleet\u002F13.local-models\u002F03.sizing-and-cost",{"title":1326,"path":1327,"stem":1328,"icon":1241},"Agents on a Mac with MLX","\u002Ffleet\u002Flocal-models-on-a-mac","07.fleet\u002F14.local-models-on-a-mac",{"title":1330,"path":1331,"stem":1332,"icon":127},"Queues","\u002Ffleet\u002Fqueues","07.fleet\u002F15.queues",{"title":1334,"path":1335,"stem":1336,"children":1337,"icon":1339},"Choose a Temporal backend","\u002Ffleet\u002Ftemporal-backends","07.fleet\u002F16.temporal-backends\u002F00.index",[1338,1340,1344,1348],{"title":1334,"path":1335,"stem":1336,"icon":1339},"i-ph-cloud",{"title":1341,"path":1342,"stem":1343},"Set retention and move tenants","\u002Ffleet\u002Ftemporal-backends\u002Fretention-and-migration","07.fleet\u002F16.temporal-backends\u002F01.retention-and-migration",{"title":1345,"path":1346,"stem":1347},"Encrypt Temporal payloads","\u002Ffleet\u002Ftemporal-backends\u002Fencryption","07.fleet\u002F16.temporal-backends\u002F02.encryption",{"title":1349,"path":1350,"stem":1351},"Read payloads in Temporal UI","\u002Ffleet\u002Ftemporal-backends\u002Fcodec","07.fleet\u002F16.temporal-backends\u002F03.codec",{"title":1353,"path":1354,"stem":1355,"icon":1356},"Regions","\u002Ffleet\u002Fregions","07.fleet\u002F17.regions","i-ph-globe-hemisphere-east",{"title":1358,"path":1359,"stem":1360,"children":1361,"icon":1363},"Run the roles separately","\u002Ffleet\u002Fseparate-roles","07.fleet\u002F18.separate-roles\u002F00.index",[1362,1364,1368,1372,1376],{"title":1358,"path":1359,"stem":1360,"icon":1363},"i-ph-squares-four",{"title":1365,"path":1366,"stem":1367},"Prepare database rights","\u002Ffleet\u002Fseparate-roles\u002Fdatabase-rights","07.fleet\u002F18.separate-roles\u002F01.database-rights",{"title":1369,"path":1370,"stem":1371},"Keep plaintext secrets on edges","\u002Ffleet\u002Fseparate-roles\u002Fsecrets","07.fleet\u002F18.separate-roles\u002F02.secrets",{"title":1373,"path":1374,"stem":1375},"Operate through role outages","\u002Ffleet\u002Fseparate-roles\u002Foutages","07.fleet\u002F18.separate-roles\u002F03.outages",{"title":1377,"path":1378,"stem":1379},"Use Temporal UI with separate roles","\u002Ffleet\u002Fseparate-roles\u002Ftemporal-ui","07.fleet\u002F18.separate-roles\u002F04.temporal-ui",{"title":1381,"path":1382,"stem":1383,"icon":1384},"High availability","\u002Ffleet\u002Fhigh-availability","07.fleet\u002F19.high-availability","i-ph-copy",{"title":1386,"path":1387,"stem":1388,"icon":1389},"Management over a WAN","\u002Ffleet\u002Fmanagement-over-a-wan","07.fleet\u002F20.management-over-a-wan","i-ph-globe-hemisphere-west",{"title":1391,"path":1392,"stem":1393,"icon":1394},"Cloud federation","\u002Ffleet\u002Fcloud-federation","07.fleet\u002F21.cloud-federation","i-ph-cloud-check",{"title":1396,"path":1397,"stem":1398,"icon":451},"Payload storage","\u002Ffleet\u002Fpayload-storage","07.fleet\u002F22.payload-storage",{"title":1400,"path":1401,"stem":1402,"children":1403,"icon":1405},"Upgrade a cluster","\u002Ffleet\u002Fupgrades","07.fleet\u002F23.upgrades\u002F00.index",[1404,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454],{"title":1400,"path":1401,"stem":1402,"icon":1405},"i-ph-arrows-clockwise",{"title":1407,"path":1408,"stem":1409},"Prepare for sandbox changes","\u002Ffleet\u002Fupgrades\u002Fsandbox-changes","07.fleet\u002F23.upgrades\u002F01.sandbox-changes",{"title":1411,"path":1412,"stem":1413},"Review policy changes","\u002Ffleet\u002Fupgrades\u002Fpolicy-changes","07.fleet\u002F23.upgrades\u002F02.policy-changes",{"title":1415,"path":1416,"stem":1417},"Review data and privacy migrations","\u002Ffleet\u002Fupgrades\u002Fdata-migrations","07.fleet\u002F23.upgrades\u002F03.data-migrations",{"title":1419,"path":1420,"stem":1421},"Prepare storage and identity migrations","\u002Ffleet\u002Fupgrades\u002Fstorage-and-identity","07.fleet\u002F23.upgrades\u002F04.storage-and-identity",{"title":1423,"path":1424,"stem":1425},"Prepare plugins for an upgrade","\u002Ffleet\u002Fupgrades\u002Fplugin-changes","07.fleet\u002F23.upgrades\u002F05.plugin-changes",{"title":1427,"path":1428,"stem":1429},"Keep calls compatible during upgrades","\u002Ffleet\u002Fupgrades\u002Fcall-compatibility","07.fleet\u002F23.upgrades\u002F06.call-compatibility",{"title":1431,"path":1432,"stem":1433},"Review model and budget migrations","\u002Ffleet\u002Fupgrades\u002Fmodel-and-budget-changes","07.fleet\u002F23.upgrades\u002F07.model-and-budget-changes",{"title":1435,"path":1436,"stem":1437},"Migrate to shared worker pools","\u002Ffleet\u002Fupgrades\u002Fshared-pools","07.fleet\u002F23.upgrades\u002F08.shared-pools",{"title":1439,"path":1440,"stem":1441},"Upgrade node binaries and runtimes","\u002Ffleet\u002Fupgrades\u002Fnodes","07.fleet\u002F23.upgrades\u002F09.nodes",{"title":1443,"path":1444,"stem":1445},"Understand runtime shutdown","\u002Ffleet\u002Fupgrades\u002Fruntime-shutdown","07.fleet\u002F23.upgrades\u002F10.runtime-shutdown",{"title":1447,"path":1448,"stem":1449},"Review runtime behaviour changes","\u002Ffleet\u002Fupgrades\u002Fruntime-changes","07.fleet\u002F23.upgrades\u002F11.runtime-changes",{"title":1451,"path":1452,"stem":1453},"Verify releases and switch channels","\u002Ffleet\u002Fupgrades\u002Frelease-verification","07.fleet\u002F23.upgrades\u002F12.release-verification",{"title":1455,"path":1456,"stem":1457},"Roll a runtime out in steps","\u002Ffleet\u002Fupgrades\u002Fruntime-rollouts","07.fleet\u002F23.upgrades\u002F13.runtime-rollouts",{"title":1459,"path":1460,"stem":1461,"icon":463},"Releases","\u002Ffleet\u002Freleases","07.fleet\u002F24.releases",{"title":1463,"path":1464,"stem":1465,"icon":1466},"Docker","\u002Ffleet\u002Fdocker","07.fleet\u002F25.docker","i-ph-shipping-container",{"title":1468,"path":1469,"stem":1470,"children":1471,"icon":480},"Deploy with Kubernetes","\u002Ffleet\u002Fkubernetes","07.fleet\u002F26.kubernetes\u002F00.index",[1472,1473,1477],{"title":1468,"path":1469,"stem":1470,"icon":480},{"title":1474,"path":1475,"stem":1476,"icon":480},"Helm objects and values","\u002Ffleet\u002Fkubernetes\u002Fvalues","07.fleet\u002F26.kubernetes\u002F01.values",{"title":1478,"path":1479,"stem":1480,"icon":480},"Maintain a Kubernetes deployment","\u002Ffleet\u002Fkubernetes\u002Fmaintenance","07.fleet\u002F26.kubernetes\u002F02.maintenance",{"title":1482,"path":1483,"stem":1484,"icon":1485},"Offline install","\u002Ffleet\u002Foffline-install","07.fleet\u002F27.offline-install","i-ph-airplane-tilt",{"title":1487,"path":1488,"stem":1489,"icon":98},"FIPS builds","\u002Ffleet\u002Ffips","07.fleet\u002F28.fips",{"title":1491,"path":1492,"stem":1493,"icon":249},"Run Orchestrator Zero from an MCP client","\u002Ffleet\u002Fmcp-client","07.fleet\u002F29.mcp-client",{"title":1495,"path":1496,"stem":1497,"children":1498,"icon":451},"Back up a cluster","\u002Ffleet\u002Fbackups","07.fleet\u002F30.backups\u002F00.index",[1499,1500],{"title":1495,"path":1496,"stem":1497,"icon":451},{"title":1501,"path":1502,"stem":1503},"Restore a cluster","\u002Ffleet\u002Fbackups\u002Frestore","07.fleet\u002F30.backups\u002F01.restore",{"title":1505,"path":1506,"stem":1507,"children":1508,"icon":71},"Spend","\u002Fspend","08.spend\u002F00.index",[1509,1511,1533,1547,1585],{"title":1510,"path":1506,"stem":1507},"Manage model access and spending",{"title":1512,"path":1513,"stem":1514,"children":1515,"icon":552},"Read cost and usage","\u002Fspend\u002Fcost-and-usage","08.spend\u002F01.cost-and-usage\u002F00.index",[1516,1517,1521,1525,1529],{"title":1512,"path":1513,"stem":1514,"icon":552},{"title":1518,"path":1519,"stem":1520},"Understand recorded charges","\u002Fspend\u002Fcost-and-usage\u002Faccounting","08.spend\u002F01.cost-and-usage\u002F01.accounting",{"title":1522,"path":1523,"stem":1524},"Read model call timings","\u002Fspend\u002Fcost-and-usage\u002Ftimings","08.spend\u002F01.cost-and-usage\u002F02.timings",{"title":1526,"path":1527,"stem":1528},"Export usage","\u002Fspend\u002Fcost-and-usage\u002Fexports","08.spend\u002F01.cost-and-usage\u002F03.exports",{"title":1530,"path":1531,"stem":1532},"Explain prices and cache costs","\u002Fspend\u002Fcost-and-usage\u002Fprices-and-cache","08.spend\u002F01.cost-and-usage\u002F04.prices-and-cache",{"title":1534,"path":1535,"stem":1536,"children":1537,"icon":134},"Set budgets and quotas","\u002Fspend\u002Fbudgets-and-quotas","08.spend\u002F02.budgets-and-quotas\u002F00.index",[1538,1539,1543],{"title":1534,"path":1535,"stem":1536,"icon":134},{"title":1540,"path":1541,"stem":1542,"icon":134},"Understand quota charging and refusals","\u002Fspend\u002Fbudgets-and-quotas\u002Fcharging","08.spend\u002F02.budgets-and-quotas\u002F01.charging",{"title":1544,"path":1545,"stem":1546,"icon":134},"Request and review budget","\u002Fspend\u002Fbudgets-and-quotas\u002Frequests","08.spend\u002F02.budgets-and-quotas\u002F02.requests",{"title":1548,"path":1549,"stem":1550,"children":1551,"icon":416},"Connect a model provider","\u002Fspend\u002Fmodels-and-keys","08.spend\u002F03.models-and-keys\u002F00.index",[1552,1553,1557,1561,1565,1569,1573,1577,1581],{"title":1548,"path":1549,"stem":1550,"icon":416},{"title":1554,"path":1555,"stem":1556},"Choose model aliases","\u002Fspend\u002Fmodels-and-keys\u002Faliases","08.spend\u002F03.models-and-keys\u002F01.aliases",{"title":1558,"path":1559,"stem":1560},"Map a plugin's models","\u002Fspend\u002Fmodels-and-keys\u002Fmapping","08.spend\u002F03.models-and-keys\u002F02.mapping",{"title":1562,"path":1563,"stem":1564},"Set reasoning effort and cascades","\u002Fspend\u002Fmodels-and-keys\u002Feffort-and-cascades","08.spend\u002F03.models-and-keys\u002F03.effort-and-cascades",{"title":1566,"path":1567,"stem":1568},"Authenticate model calls","\u002Fspend\u002Fmodels-and-keys\u002Fauthentication","08.spend\u002F03.models-and-keys\u002F04.authentication",{"title":1570,"path":1571,"stem":1572},"Control what model calls can reach","\u002Fspend\u002Fmodels-and-keys\u002Fdata-rules","08.spend\u002F03.models-and-keys\u002F05.data-rules",{"title":1574,"path":1575,"stem":1576},"Pool model deployments","\u002Fspend\u002Fmodels-and-keys\u002Fdeployment-pools","08.spend\u002F03.models-and-keys\u002F06.deployment-pools",{"title":1578,"path":1579,"stem":1580},"Configure caches and server tools","\u002Fspend\u002Fmodels-and-keys\u002Fcache-and-tools","08.spend\u002F03.models-and-keys\u002F07.cache-and-tools",{"title":1582,"path":1583,"stem":1584},"Check model changes and retirement","\u002Fspend\u002Fmodels-and-keys\u002Fcanaries-and-retirement","08.spend\u002F03.models-and-keys\u002F08.canaries-and-retirement",{"title":1586,"path":1587,"stem":1588,"icon":1589},"Translating providers","\u002Fspend\u002Ftranslating-providers","08.spend\u002F04.translating-providers","i-ph-translate",{"title":1591,"path":1592,"stem":1593,"children":1594,"icon":71},"Admin","\u002Fadmin","09.admin\u002F00.index",[1595,1597,1623,1650,1654,1658,1680,1685,1696],{"title":1596,"path":1592,"stem":1593},"Administer access and credentials",{"title":1598,"path":1599,"stem":1600,"children":1601,"icon":98},"Configure sign-in","\u002Fadmin\u002Fsign-in","09.admin\u002F01.sign-in\u002F00.index",[1602,1603,1607,1611,1615,1619],{"title":1598,"path":1599,"stem":1600,"icon":98},{"title":1604,"path":1605,"stem":1606},"Configure an identity provider","\u002Fadmin\u002Fsign-in\u002Fidentity-providers","09.admin\u002F01.sign-in\u002F01.identity-providers",{"title":1608,"path":1609,"stem":1610},"Provision accounts from a directory","\u002Fadmin\u002Fsign-in\u002Fprovisioning","09.admin\u002F01.sign-in\u002F02.provisioning",{"title":1612,"path":1613,"stem":1614},"Manage passwords and second factors","\u002Fadmin\u002Fsign-in\u002Fpasswords","09.admin\u002F01.sign-in\u002F03.passwords",{"title":1616,"path":1617,"stem":1618},"Sign in from the CLI and MCP clients","\u002Fadmin\u002Fsign-in\u002Fclients","09.admin\u002F01.sign-in\u002F04.clients",{"title":1620,"path":1621,"stem":1622},"End sessions and inspect sign-in events","\u002Fadmin\u002Fsign-in\u002Fsessions","09.admin\u002F01.sign-in\u002F05.sessions",{"title":1624,"path":1625,"stem":1626,"children":1627,"icon":1629},"Manage tenant secrets","\u002Fadmin\u002Fsecrets","09.admin\u002F02.secrets\u002F00.index",[1628,1630,1634,1638,1642,1646],{"title":1624,"path":1625,"stem":1626,"icon":1629},"i-ph-key",{"title":1631,"path":1632,"stem":1633},"Bind secrets to destination hosts","\u002Fadmin\u002Fsecrets\u002Fhost-bindings","09.admin\u002F02.secrets\u002F01.host-bindings",{"title":1635,"path":1636,"stem":1637},"Test and rotate secrets","\u002Fadmin\u002Fsecrets\u002Frotation","09.admin\u002F02.secrets\u002F02.rotation",{"title":1639,"path":1640,"stem":1641},"Use an external secret store","\u002Fadmin\u002Fsecrets\u002Fexternal-stores","09.admin\u002F02.secrets\u002F03.external-stores",{"title":1643,"path":1644,"stem":1645},"Deliver and scan plugin secrets","\u002Fadmin\u002Fsecrets\u002Fplugin-secrets","09.admin\u002F02.secrets\u002F04.plugin-secrets",{"title":1647,"path":1648,"stem":1649},"Configure plugin settings","\u002Fadmin\u002Fsecrets\u002Fsettings","09.admin\u002F02.secrets\u002F05.settings",{"title":1651,"path":1652,"stem":1653,"icon":1629},"Credential injection","\u002Fadmin\u002Fcredential-injection","09.admin\u002F03.credential-injection",{"title":1655,"path":1656,"stem":1657,"icon":1629},"Key commands","\u002Fadmin\u002Fkey-commands","09.admin\u002F04.key-commands",{"title":1659,"path":1660,"stem":1661,"children":1662,"icon":782},"Connect a plugin to another system","\u002Fadmin\u002Fconnections","09.admin\u002F05.connections\u002F00.index",[1663,1664,1668,1672,1676],{"title":1659,"path":1660,"stem":1661,"icon":782},{"title":1665,"path":1666,"stem":1667,"icon":782},"Renew and reconnect credentials","\u002Fadmin\u002Fconnections\u002Frenewal","09.admin\u002F05.connections\u002F01.renewal",{"title":1669,"path":1670,"stem":1671,"icon":782},"Restrict connection destinations","\u002Fadmin\u002Fconnections\u002Fdestinations","09.admin\u002F05.connections\u002F02.destinations",{"title":1673,"path":1674,"stem":1675,"icon":782},"Diagnose connection failures","\u002Fadmin\u002Fconnections\u002Ftroubleshooting","09.admin\u002F05.connections\u002F03.troubleshooting",{"title":1677,"path":1678,"stem":1679,"icon":782},"Understand connection security","\u002Fadmin\u002Fconnections\u002Fsecurity","09.admin\u002F05.connections\u002F04.security",{"title":1681,"path":1682,"stem":1683,"icon":1684},"Tenants","\u002Fadmin\u002Ftenants","09.admin\u002F06.tenants","i-ph-buildings",{"title":1686,"path":1687,"stem":1688,"children":1689,"icon":1691},"Export and verify a tenant","\u002Fadmin\u002Ftenant-export","09.admin\u002F07.tenant-export\u002F00.index",[1690,1692],{"title":1686,"path":1687,"stem":1688,"icon":1691},"i-ph-export",{"title":1693,"path":1694,"stem":1695,"icon":1691},"Tenant export format","\u002Fadmin\u002Ftenant-export\u002Fformat","09.admin\u002F07.tenant-export\u002F01.format",{"title":1697,"path":1698,"stem":1699,"icon":1700},"Notifications","\u002Fadmin\u002Fnotifications","09.admin\u002F08.notifications","i-ph-bell-ringing",{"title":1702,"path":1703,"stem":1704,"children":1705,"icon":71},"Reference","\u002Freference","10.reference\u002F00.index",[1706,1707,1726,1760,1794,1798,1803,1807,1812,1817,1822,1826],{"title":1702,"path":1703,"stem":1704},{"title":1708,"path":1709,"stem":1710,"children":1711,"icon":1725},"CLI","\u002Freference\u002Fcli","10.reference\u002F01.cli\u002F00.index",[1712,1713,1719],{"title":1708,"path":1709,"stem":1710},{"title":1714,"path":1715,"stem":1716,"children":1717},"oz0","\u002Freference\u002Fcli\u002Foz0","10.reference\u002F01.cli\u002F01.oz0\u002F00.index",[1718],{"title":1714,"path":1715,"stem":1716},{"title":1720,"path":1721,"stem":1722,"children":1723},"oz0-node","\u002Freference\u002Fcli\u002Foz0-node","10.reference\u002F01.cli\u002F02.oz0-node\u002F00.index",[1724],{"title":1720,"path":1721,"stem":1722},"i-ph-terminal-window",{"title":1727,"path":1728,"stem":1729,"children":1730,"icon":725},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","10.reference\u002F02.plugin-manifest\u002F00.index",[1731,1732,1736,1740,1744,1748,1752,1756],{"title":1727,"path":1728,"stem":1729,"icon":725},{"title":1733,"path":1734,"stem":1735},"Dependencies and cross-plugin access","\u002Freference\u002Fplugin-manifest\u002Fdependencies","10.reference\u002F02.plugin-manifest\u002F01.dependencies",{"title":1737,"path":1738,"stem":1739},"Tool declarations","\u002Freference\u002Fplugin-manifest\u002Ftools","10.reference\u002F02.plugin-manifest\u002F02.tools",{"title":1741,"path":1742,"stem":1743},"Harnesses, events and channels","\u002Freference\u002Fplugin-manifest\u002Fruntimes","10.reference\u002F02.plugin-manifest\u002F03.runtimes",{"title":1745,"path":1746,"stem":1747},"Connections and hooks","\u002Freference\u002Fplugin-manifest\u002Fconnections","10.reference\u002F02.plugin-manifest\u002F04.connections",{"title":1749,"path":1750,"stem":1751},"Plugin sets and policies","\u002Freference\u002Fplugin-manifest\u002Fsets-policy","10.reference\u002F02.plugin-manifest\u002F05.sets-policy",{"title":1753,"path":1754,"stem":1755},"Data, evidence and mail","\u002Freference\u002Fplugin-manifest\u002Fdata","10.reference\u002F02.plugin-manifest\u002F06.data",{"title":1757,"path":1758,"stem":1759},"Generated OpenAPI manifests","\u002Freference\u002Fplugin-manifest\u002Fopenapi","10.reference\u002F02.plugin-manifest\u002F07.openapi",{"title":1761,"path":1762,"stem":1763,"children":1764,"icon":666},"Agent definition","\u002Freference\u002Fagent-definition","10.reference\u002F03.agent-definition\u002F00.index",[1765,1766,1770,1774,1778,1782,1786,1790],{"title":1761,"path":1762,"stem":1763,"icon":666},{"title":1767,"path":1768,"stem":1769},"Identity, instructions and tools","\u002Freference\u002Fagent-definition\u002Fidentity","10.reference\u002F03.agent-definition\u002F01.identity",{"title":1771,"path":1772,"stem":1773},"Models and placement","\u002Freference\u002Fagent-definition\u002Fmodels","10.reference\u002F03.agent-definition\u002F02.models",{"title":1775,"path":1776,"stem":1777},"Limits and spend","\u002Freference\u002Fagent-definition\u002Flimits","10.reference\u002F03.agent-definition\u002F03.limits",{"title":1779,"path":1780,"stem":1781},"Judges and candidate selection","\u002Freference\u002Fagent-definition\u002Fquality","10.reference\u002F03.agent-definition\u002F04.quality",{"title":1783,"path":1784,"stem":1785},"Delegation and human decisions","\u002Freference\u002Fagent-definition\u002Fcoordination","10.reference\u002F03.agent-definition\u002F05.coordination",{"title":1787,"path":1788,"stem":1789},"History and recovery","\u002Freference\u002Fagent-definition\u002Fhistory","10.reference\u002F03.agent-definition\u002F06.history",{"title":1791,"path":1792,"stem":1793},"Sandbox, data and retention","\u002Freference\u002Fagent-definition\u002Fsecurity","10.reference\u002F03.agent-definition\u002F07.security",{"title":1795,"path":1796,"stem":1797,"icon":517},"Ports","\u002Freference\u002Fports","10.reference\u002F04.ports",{"title":1799,"path":1800,"stem":1801,"icon":1802},"Environment variables","\u002Freference\u002Fenvironment","10.reference\u002F05.environment","i-ph-brackets-curly",{"title":1804,"path":1805,"stem":1806,"icon":373},"Files and directories","\u002Freference\u002Ffiles","10.reference\u002F06.files",{"title":1808,"path":1809,"stem":1810,"icon":1811},"Lists and pages","\u002Freference\u002Flist-pages","10.reference\u002F07.list-pages","i-ph-list-numbers",{"title":1813,"path":1814,"stem":1815,"icon":1816},"Spend refusals","\u002Freference\u002Fspend-refusals","10.reference\u002F08.spend-refusals","i-ph-hand-coins",{"title":1818,"path":1819,"stem":1820,"icon":1821},"Admin API","\u002Freference\u002Fadmin-api","10.reference\u002F09.admin-api","i-ph-repeat",{"title":1823,"path":1824,"stem":1825},"Compatibility","\u002Freference\u002Fcompatibility","10.reference\u002F10.compatibility",{"title":1827,"path":1828,"stem":1829},"Known issues","\u002Freference\u002Fknown-issues","10.reference\u002F11.known-issues",{"title":1831,"path":1832,"stem":1833,"children":1834,"icon":71},"About","\u002Fabout","11.about\u002F00.index",[1835,1836,1840,1845],{"title":1831,"path":1832,"stem":1833},{"title":1837,"path":1838,"stem":1839,"icon":967},"Licensing","\u002Fabout\u002Flicensing","11.about\u002F01.licensing",{"title":1841,"path":1842,"stem":1843,"icon":1844},"About these docs","\u002Fabout\u002Fcontributing-docs","11.about\u002F02.contributing-docs","i-ph-pencil-simple",{"title":1846,"path":1847,"stem":1848,"icon":42},"A local environment","\u002Fabout\u002Flocal-environment","11.about\u002F03.local-environment",{"id":1850,"title":762,"body":1851,"description":3615,"extension":3616,"links":3617,"meta":3618,"navigation":3621,"path":763,"seo":3622,"stem":764,"__hash__":3623},"docs\u002F04.build\u002F02.parts\u002F10.event-sources\u002F00.index.md",{"type":1852,"value":1853,"toc":3608},"minimark",[1854,1858,1866,1883,1886,1916,1921,2213,2495,2498,2647,2662,2667,2670,2842,2943,2972,2989,3006,3009,3055,3063,3074,3082,3093,3097,3103,3222,3225,3376,3405,3437,3444,3518,3521,3525,3537,3604],[1855,1856,1857],"p",{},"For: plugin authors.",[1855,1859,1860,1861,1865],{},"Declare an event source to turn deliveries from an outside system into events your agents can use. The edge receives a delivery at ",[1862,1863,1864],"code",{},"POST \u002Fevents\u002F\u003Ctenant>\u002F\u003Csource>","; a function in your plugin interprets it.",[1855,1867,1868,1873,1874,1878,1879,1882],{},[1869,1870,1872],"a",{"href":1871},"\u002Fbuild\u002Fparts\u002Froutines#events","Routines"," and ",[1869,1875,1877],{"href":1876},"\u002Fbuild\u002Fparts\u002Fflows#start-one-from-an-event","flows"," can start from these events, and running jobs can ",[1869,1880,1881],{"href":238},"wait for them",". The plugin defines the vendor's payload format, so adding a system requires a plugin rather than a core change.",[1855,1884,1885],{},"For each delivery:",[1887,1888,1889,1897,1909],"ol",{},[1890,1891,1892,1893,1896],"li",{},"The edge checks its size and its signature, with a tenant secret only the edge reads, before anything else sees it. A forged delivery gets ",[1862,1894,1895],{},"401"," and costs no node any work.",[1890,1898,1899,1900,1903,1904,1908],{},"A node with your plugin calls your normalising function, an MCP function like any ",[1869,1901,1902],{"href":692},"tool",", with the delivery. It answers with the events it found. It runs as a call that an outside event started, in the node's ",[1869,1905,1907],{"href":1906},"\u002Fconcepts\u002Fsecurity\u002Fsandbox-tiers#sandboxes","sandbox"," where there is one.",[1890,1910,1911,1912,1915],{},"The edge records each event, once per delivery ID, and routes it: to the routines and flows whose event triggers fire on it, and to the jobs that wait for such an event. Every delivery and every match is in the ",[1869,1913,1914],{"href":1186},"audit trail",".",[1917,1918,1920],"h2",{"id":1919},"declare-a-source","Declare a source",[1922,1923,1928],"pre",{"className":1924,"code":1925,"filename":1727,"language":1926,"meta":1927,"style":1927},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apiVersion: oz0\u002Fv1\nname: github-events\nversion: 1.0.0\nruntime: python\ntools:\n  - id: github_events\n    mcp: [\"python\", \"-m\", \"github_events.server\"]\n    affinity: any\nevents:\n  - name: github-events                   # POST \u002Fevents\u002F\u003Ctenant>\u002Fgithub-events\n    description: GitHub webhook deliveries\n    call: github_events.normalize         # the function that reads a delivery\n    secret: GITHUB_WEBHOOK_SECRET         # a tenant secret, which only the edge reads\n    signature:\n      scheme: hmac-sha256\n      header: X-Hub-Signature-256\n      prefix: \"sha256=\"\n    delivery_header: X-GitHub-Delivery\n    types: [pull_request, pull_request_review, check_suite, workflow_run, issue_comment]\n","yaml","",[1862,1929,1930,1947,1958,1970,1981,1990,2004,2046,2057,2065,2082,2093,2107,2121,2129,2140,2151,2167,2178],{"__ignoreMap":1927},[1931,1932,1935,1939,1943],"span",{"class":1933,"line":1934},"line",1,[1931,1936,1938],{"class":1937},"swJcz","apiVersion",[1931,1940,1942],{"class":1941},"sMK4o",":",[1931,1944,1946],{"class":1945},"sfazB"," oz0\u002Fv1\n",[1931,1948,1950,1953,1955],{"class":1933,"line":1949},2,[1931,1951,1952],{"class":1937},"name",[1931,1954,1942],{"class":1941},[1931,1956,1957],{"class":1945}," github-events\n",[1931,1959,1961,1964,1966],{"class":1933,"line":1960},3,[1931,1962,1963],{"class":1937},"version",[1931,1965,1942],{"class":1941},[1931,1967,1969],{"class":1968},"sbssI"," 1.0.0\n",[1931,1971,1973,1976,1978],{"class":1933,"line":1972},4,[1931,1974,1975],{"class":1937},"runtime",[1931,1977,1942],{"class":1941},[1931,1979,1980],{"class":1945}," python\n",[1931,1982,1984,1987],{"class":1933,"line":1983},5,[1931,1985,1986],{"class":1937},"tools",[1931,1988,1989],{"class":1941},":\n",[1931,1991,1993,1996,1999,2001],{"class":1933,"line":1992},6,[1931,1994,1995],{"class":1941},"  -",[1931,1997,1998],{"class":1937}," id",[1931,2000,1942],{"class":1941},[1931,2002,2003],{"class":1945}," github_events\n",[1931,2005,2007,2010,2012,2015,2018,2021,2023,2026,2029,2032,2034,2036,2038,2041,2043],{"class":1933,"line":2006},7,[1931,2008,2009],{"class":1937},"    mcp",[1931,2011,1942],{"class":1941},[1931,2013,2014],{"class":1941}," [",[1931,2016,2017],{"class":1941},"\"",[1931,2019,2020],{"class":1945},"python",[1931,2022,2017],{"class":1941},[1931,2024,2025],{"class":1941},",",[1931,2027,2028],{"class":1941}," \"",[1931,2030,2031],{"class":1945},"-m",[1931,2033,2017],{"class":1941},[1931,2035,2025],{"class":1941},[1931,2037,2028],{"class":1941},[1931,2039,2040],{"class":1945},"github_events.server",[1931,2042,2017],{"class":1941},[1931,2044,2045],{"class":1941},"]\n",[1931,2047,2049,2052,2054],{"class":1933,"line":2048},8,[1931,2050,2051],{"class":1937},"    affinity",[1931,2053,1942],{"class":1941},[1931,2055,2056],{"class":1945}," any\n",[1931,2058,2060,2063],{"class":1933,"line":2059},9,[1931,2061,2062],{"class":1937},"events",[1931,2064,1989],{"class":1941},[1931,2066,2068,2070,2073,2075,2078],{"class":1933,"line":2067},10,[1931,2069,1995],{"class":1941},[1931,2071,2072],{"class":1937}," name",[1931,2074,1942],{"class":1941},[1931,2076,2077],{"class":1945}," github-events",[1931,2079,2081],{"class":2080},"sHwdD","                   # POST \u002Fevents\u002F\u003Ctenant>\u002Fgithub-events\n",[1931,2083,2085,2088,2090],{"class":1933,"line":2084},11,[1931,2086,2087],{"class":1937},"    description",[1931,2089,1942],{"class":1941},[1931,2091,2092],{"class":1945}," GitHub webhook deliveries\n",[1931,2094,2096,2099,2101,2104],{"class":1933,"line":2095},12,[1931,2097,2098],{"class":1937},"    call",[1931,2100,1942],{"class":1941},[1931,2102,2103],{"class":1945}," github_events.normalize",[1931,2105,2106],{"class":2080},"         # the function that reads a delivery\n",[1931,2108,2110,2113,2115,2118],{"class":1933,"line":2109},13,[1931,2111,2112],{"class":1937},"    secret",[1931,2114,1942],{"class":1941},[1931,2116,2117],{"class":1945}," GITHUB_WEBHOOK_SECRET",[1931,2119,2120],{"class":2080},"         # a tenant secret, which only the edge reads\n",[1931,2122,2124,2127],{"class":1933,"line":2123},14,[1931,2125,2126],{"class":1937},"    signature",[1931,2128,1989],{"class":1941},[1931,2130,2132,2135,2137],{"class":1933,"line":2131},15,[1931,2133,2134],{"class":1937},"      scheme",[1931,2136,1942],{"class":1941},[1931,2138,2139],{"class":1945}," hmac-sha256\n",[1931,2141,2143,2146,2148],{"class":1933,"line":2142},16,[1931,2144,2145],{"class":1937},"      header",[1931,2147,1942],{"class":1941},[1931,2149,2150],{"class":1945}," X-Hub-Signature-256\n",[1931,2152,2154,2157,2159,2161,2164],{"class":1933,"line":2153},17,[1931,2155,2156],{"class":1937},"      prefix",[1931,2158,1942],{"class":1941},[1931,2160,2028],{"class":1941},[1931,2162,2163],{"class":1945},"sha256=",[1931,2165,2166],{"class":1941},"\"\n",[1931,2168,2170,2173,2175],{"class":1933,"line":2169},18,[1931,2171,2172],{"class":1937},"    delivery_header",[1931,2174,1942],{"class":1941},[1931,2176,2177],{"class":1945}," X-GitHub-Delivery\n",[1931,2179,2181,2184,2186,2188,2191,2193,2196,2198,2201,2203,2206,2208,2211],{"class":1933,"line":2180},19,[1931,2182,2183],{"class":1937},"    types",[1931,2185,1942],{"class":1941},[1931,2187,2014],{"class":1941},[1931,2189,2190],{"class":1945},"pull_request",[1931,2192,2025],{"class":1941},[1931,2194,2195],{"class":1945}," pull_request_review",[1931,2197,2025],{"class":1941},[1931,2199,2200],{"class":1945}," check_suite",[1931,2202,2025],{"class":1941},[1931,2204,2205],{"class":1945}," workflow_run",[1931,2207,2025],{"class":1941},[1931,2209,2210],{"class":1945}," issue_comment",[1931,2212,2045],{"class":1941},[2214,2215,2216,2232],"table",{},[2217,2218,2219],"thead",{},[2220,2221,2222,2226,2229],"tr",{},[2223,2224,2225],"th",{},"Field",[2223,2227,2228],{},"Meaning",[2223,2230,2231],{},"Default",[2233,2234,2235,2256,2272,2284,2313,2328,2352,2388,2411,2438,2450,2463,2479],"tbody",{},[2220,2236,2237,2242,2253],{},[2238,2239,2240],"td",{},[1862,2241,1952],{},[2238,2243,2244,2245,2248,2249,2252],{},"The source's name in the tenant: lowercase letters, digits and dashes, at most 31. Two installed plugins with one source's name make its deliveries fail until one is removed, so start it with your plugin's name (",[1862,2246,2247],{},"github-events",", not ",[1862,2250,2251],{},"github",").",[2238,2254,2255],{},"required",[2220,2257,2258,2263,2270],{},[2238,2259,2260],{},[1862,2261,2262],{},"call",[2238,2264,2265,2266,2269],{},"The ",[1862,2267,2268],{},"\u003Ctool>.\u003Cfunction>"," of this plugin that normalises a delivery",[2238,2271,2255],{},[2220,2273,2274,2279,2282],{},[2238,2275,2276],{},[1862,2277,2278],{},"secret",[2238,2280,2281],{},"The tenant secret deliveries are signed with, or carry",[2238,2283,2255],{},[2220,2285,2286,2291,2311],{},[2238,2287,2288],{},[1862,2289,2290],{},"signature.scheme",[2238,2292,2293,2296,2297,2296,2300,2296,2303,2306,2307,2310],{},[1862,2294,2295],{},"hmac-sha256",", ",[1862,2298,2299],{},"ed25519",[1862,2301,2302],{},"jwt",[1862,2304,2305],{},"token"," or ",[1862,2308,2309],{},"plugin"," (below)",[2238,2312,2255],{},[2220,2314,2315,2323,2326],{},[2238,2316,2317,2296,2320],{},[1862,2318,2319],{},"signature.header",[1862,2321,2322],{},"prefix",[2238,2324,2325],{},"Where the signature comes, and what comes before it",[2238,2327],{},[2220,2329,2330,2335,2348],{},[2238,2331,2332],{},[1862,2333,2334],{},"signature.encoding",[2238,2336,2337,2306,2340,2343,2344,1873,2346],{},[1862,2338,2339],{},"hex",[1862,2341,2342],{},"base64",", for ",[1862,2345,2295],{},[1862,2347,2299],{},[2238,2349,2350],{},[1862,2351,2339],{},[2220,2353,2354,2362,2385],{},[2238,2355,2356,2296,2359],{},[1862,2357,2358],{},"signature.timestamp",[1862,2360,2361],{},"max_age_s",[2238,2363,2364,2365,2367,2368,2371,2372,2375,2376,2378,2379,2381,2382,2384],{},"A header with the time the sender signed at, in Unix seconds: a delivery signed more than ",[1862,2366,2361],{}," from the edge's clock is refused, so an old one cannot be sent again. The signature must cover it: ",[1862,2369,2370],{},"message"," holds ",[1862,2373,2374],{},"{timestamp}",", and lint refuses a timestamp with a ",[1862,2377,2305],{}," or without ",[1862,2380,2374],{}," in ",[1862,2383,2370],{},", since a time nobody signed can be set to now",[2238,2386,2387],{},"none; 300",[2220,2389,2390,2395,2407],{},[2238,2391,2392],{},[1862,2393,2394],{},"signature.message",[2238,2396,2397,2398,1873,2401,2403,2404],{},"What the sender signs, of ",[1862,2399,2400],{},"{body}",[1862,2402,2374],{},", such as ",[1862,2405,2406],{},"v0:{timestamp}:{body}",[2238,2408,2409],{},[1862,2410,2400],{},[2220,2412,2413,2418,2429],{},[2238,2414,2415],{},[1862,2416,2417],{},"delivery_header",[2238,2419,2420,2421,2424,2425,2428],{},"The header with the sender's ID for one delivery, recorded with it (",[1862,2422,2423],{},"sender_delivery"," in its ",[1862,2426,2427],{},"event.delivery"," entry). No signature covers it, so it never names the delivery: the body's SHA-256 does",[2238,2430,2431,2434,2435],{},[1862,2432,2433],{},"Idempotency-Key",", then ",[1862,2436,2437],{},"X-Request-Id",[2220,2439,2440,2445,2448],{},[2238,2441,2442],{},[1862,2443,2444],{},"types",[2238,2446,2447],{},"The event types your function gives, for people and lint",[2238,2449],{},[2220,2451,2452,2457,2460],{},[2238,2453,2454],{},[1862,2455,2456],{},"max_body_kb",[2238,2458,2459],{},"The largest delivery taken",[2238,2461,2462],{},"1024",[2220,2464,2465,2470,2477],{},[2238,2466,2467],{},[1862,2468,2469],{},"replies",[2238,2471,2472,2473],{},"What the edge answers at once, ",[1869,2474,2476],{"href":2475},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding#answer-at-once","below",[2238,2478],{},[2220,2480,2481,2486,2492],{},[2238,2482,2483],{},[1862,2484,2485],{},"bind",[2238,2487,2488,2489],{},"What the edge checks of your function's events against the delivery, ",[1869,2490,2476],{"href":2491},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding#bind-events-to-the-delivery",[2238,2493,2494],{},"none: nothing matches on the events' fields",[1855,2496,2497],{},"The signature schemes name no vendor:",[2214,2499,2500,2513],{},[2217,2501,2502],{},[2220,2503,2504,2507,2510],{},[2223,2505,2506],{},"Scheme",[2223,2508,2509],{},"The edge checks",[2223,2511,2512],{},"For example",[2233,2514,2515,2544,2571,2592,2612,2632],{},[2220,2516,2517,2521,2531],{},[2238,2518,2519],{},[1862,2520,2295],{},[2238,2522,2523,2524,2527,2528,2530],{},"An HMAC-SHA256 of the raw body with the secret as its key, in ",[1862,2525,2526],{},"header"," after ",[1862,2529,2322],{},", hex or base64, compared in constant time",[2238,2532,2533,2534,2296,2537,2539,2540,2543],{},"GitHub (",[1862,2535,2536],{},"X-Hub-Signature-256",[1862,2538,2163],{},"), Gitea (",[1862,2541,2542],{},"X-Gitea-Signature",", no prefix)",[2220,2545,2546,2556,2559],{},[2238,2547,2548,2550,2551,1873,2553],{},[1862,2549,2295],{}," with ",[1862,2552,2370],{},[1862,2554,2555],{},"timestamp",[2238,2557,2558],{},"An HMAC-SHA256 of a timestamped string, refused outside its window",[2238,2560,2561,2562,2381,2564,2296,2567,2570],{},"Slack (",[1862,2563,2406],{},[1862,2565,2566],{},"X-Slack-Signature",[1862,2568,2569],{},"v0=",")",[2220,2572,2573,2577,2583],{},[2238,2574,2575],{},[1862,2576,2299],{},[2238,2578,2579,2580,2582],{},"An Ed25519 signature of ",[1862,2581,2370],{},", checked with the public key in the secret (hex or base64)",[2238,2584,2585,2586,2381,2589,2570],{},"Discord (",[1862,2587,2588],{},"{timestamp}{body}",[1862,2590,2591],{},"X-Signature-Ed25519",[2220,2593,2594,2598,2609],{},[2238,2595,2596],{},[1862,2597,2302],{},[2238,2599,2600,2601,2527,2603,2605,2606],{},"A JSON Web Token in ",[1862,2602,2526],{},[1862,2604,2322],{},", signed with a key the sender publishes, from one of its issuers, for the audience in the secret, ",[1869,2607,2476],{"href":2608},"\u002Fbuild\u002Fparts\u002Fevent-sources#bearer-tokens-jwt",[2238,2610,2611],{},"Microsoft's Bot Framework (Teams)",[2220,2613,2614,2618,2626],{},[2238,2615,2616],{},[1862,2617,2305],{},[2238,2619,2620,2621,2623,2624],{},"The secret itself in ",[1862,2622,2526],{},", after ",[1862,2625,2322],{},[2238,2627,2628,2629,2570],{},"GitLab (",[1862,2630,2631],{},"X-Gitlab-Token",[2220,2633,2634,2638,2644],{},[2238,2635,2636],{},[1862,2637,2309],{},[2238,2639,2640,2641],{},"Nothing: your function checks it, with the secret in its ",[1862,2642,2643],{},"requires.secrets",[2238,2645,2646],{},"A sender with a scheme the edge cannot express",[1855,2648,2649,2650,2306,2652,2654,2655,2657,2658,2661],{},"Prefer ",[1862,2651,2295],{},[1862,2653,2305],{},": with ",[1862,2656,2309],{},", every delivery, forged or not, reaches a node before it is checked, and the secret reaches your plugin's processes. ",[1862,2659,2660],{},"plugin lint"," warns about it.",[2663,2664,2666],"h3",{"id":2665},"bearer-tokens-jwt","Bearer tokens (jwt)",[1855,2668,2669],{},"Some senders sign a delivery with a token rather than an HMAC of its body: a JSON Web Token (RFC 7519) in a header,\nsigned with a key they publish as a JSON Web Key Set, often behind OpenID metadata. The edge checks it before\nanything reads the delivery:",[1922,2671,2673],{"className":1924,"code":2672,"filename":1727,"language":1926,"meta":1927,"style":1927},"events:\n  - name: teams\n    call: oz0_teams.normalize\n    secret: TEAMS_APP_ID              # the audience the tokens must be for, such as a bot's app ID\n    signature:\n      scheme: jwt\n      header: Authorization\n      prefix: \"Bearer \"\n      openid_url: https:\u002F\u002Flogin.botframework.com\u002Fv1\u002F.well-known\u002Fopenidconfiguration   # or jwks_url: the key set itself\n      issuers: [https:\u002F\u002Fapi.botframework.com]\n      algorithms: [RS256]             # the default; RS, PS and ES of 256, 384 and 512 bits may be listed\n      max_age_s: 300                  # the clock skew allowed on exp and nbf\n      claims: [serviceurl]            # claims your function gets as verified facts\n      key_fields: [endorsements]      # members of the signing key it gets, as key.\u003Cmember>\n",[1862,2674,2675,2681,2692,2701,2713,2719,2728,2737,2750,2763,2777,2795,2808,2825],{"__ignoreMap":1927},[1931,2676,2677,2679],{"class":1933,"line":1934},[1931,2678,2062],{"class":1937},[1931,2680,1989],{"class":1941},[1931,2682,2683,2685,2687,2689],{"class":1933,"line":1949},[1931,2684,1995],{"class":1941},[1931,2686,2072],{"class":1937},[1931,2688,1942],{"class":1941},[1931,2690,2691],{"class":1945}," teams\n",[1931,2693,2694,2696,2698],{"class":1933,"line":1960},[1931,2695,2098],{"class":1937},[1931,2697,1942],{"class":1941},[1931,2699,2700],{"class":1945}," oz0_teams.normalize\n",[1931,2702,2703,2705,2707,2710],{"class":1933,"line":1972},[1931,2704,2112],{"class":1937},[1931,2706,1942],{"class":1941},[1931,2708,2709],{"class":1945}," TEAMS_APP_ID",[1931,2711,2712],{"class":2080},"              # the audience the tokens must be for, such as a bot's app ID\n",[1931,2714,2715,2717],{"class":1933,"line":1983},[1931,2716,2126],{"class":1937},[1931,2718,1989],{"class":1941},[1931,2720,2721,2723,2725],{"class":1933,"line":1992},[1931,2722,2134],{"class":1937},[1931,2724,1942],{"class":1941},[1931,2726,2727],{"class":1945}," jwt\n",[1931,2729,2730,2732,2734],{"class":1933,"line":2006},[1931,2731,2145],{"class":1937},[1931,2733,1942],{"class":1941},[1931,2735,2736],{"class":1945}," Authorization\n",[1931,2738,2739,2741,2743,2745,2748],{"class":1933,"line":2048},[1931,2740,2156],{"class":1937},[1931,2742,1942],{"class":1941},[1931,2744,2028],{"class":1941},[1931,2746,2747],{"class":1945},"Bearer ",[1931,2749,2166],{"class":1941},[1931,2751,2752,2755,2757,2760],{"class":1933,"line":2059},[1931,2753,2754],{"class":1937},"      openid_url",[1931,2756,1942],{"class":1941},[1931,2758,2759],{"class":1945}," https:\u002F\u002Flogin.botframework.com\u002Fv1\u002F.well-known\u002Fopenidconfiguration",[1931,2761,2762],{"class":2080},"   # or jwks_url: the key set itself\n",[1931,2764,2765,2768,2770,2772,2775],{"class":1933,"line":2067},[1931,2766,2767],{"class":1937},"      issuers",[1931,2769,1942],{"class":1941},[1931,2771,2014],{"class":1941},[1931,2773,2774],{"class":1945},"https:\u002F\u002Fapi.botframework.com",[1931,2776,2045],{"class":1941},[1931,2778,2779,2782,2784,2786,2789,2792],{"class":1933,"line":2084},[1931,2780,2781],{"class":1937},"      algorithms",[1931,2783,1942],{"class":1941},[1931,2785,2014],{"class":1941},[1931,2787,2788],{"class":1945},"RS256",[1931,2790,2791],{"class":1941},"]",[1931,2793,2794],{"class":2080},"             # the default; RS, PS and ES of 256, 384 and 512 bits may be listed\n",[1931,2796,2797,2800,2802,2805],{"class":1933,"line":2095},[1931,2798,2799],{"class":1937},"      max_age_s",[1931,2801,1942],{"class":1941},[1931,2803,2804],{"class":1968}," 300",[1931,2806,2807],{"class":2080},"                  # the clock skew allowed on exp and nbf\n",[1931,2809,2810,2813,2815,2817,2820,2822],{"class":1933,"line":2109},[1931,2811,2812],{"class":1937},"      claims",[1931,2814,1942],{"class":1941},[1931,2816,2014],{"class":1941},[1931,2818,2819],{"class":1945},"serviceurl",[1931,2821,2791],{"class":1941},[1931,2823,2824],{"class":2080},"            # claims your function gets as verified facts\n",[1931,2826,2827,2830,2832,2834,2837,2839],{"class":1933,"line":2123},[1931,2828,2829],{"class":1937},"      key_fields",[1931,2831,1942],{"class":1941},[1931,2833,2014],{"class":1941},[1931,2835,2836],{"class":1945},"endorsements",[1931,2838,2791],{"class":1941},[1931,2840,2841],{"class":2080},"      # members of the signing key it gets, as key.\u003Cmember>\n",[2214,2843,2844,2852],{},[2217,2845,2846],{},[2220,2847,2848,2850],{},[2223,2849,2225],{},[2223,2851,2228],{},[2233,2853,2854,2871,2892,2906,2923],{},[2220,2855,2856,2864],{},[2238,2857,2858,2306,2861],{},[1862,2859,2860],{},"openid_url",[1862,2862,2863],{},"jwks_url",[2238,2865,2866,2867,2870],{},"Where the keys are: OpenID metadata whose ",[1862,2868,2869],{},"jwks_uri"," lists them, or the key set. HTTPS only.",[2220,2872,2873,2878],{},[2238,2874,2875],{},[1862,2876,2877],{},"key_hosts",[2238,2879,2880,2881,2883,2884,2887,2888,2891],{},"More hosts the keys may come from, when the metadata's ",[1862,2882,2869],{}," is on another host (",[1862,2885,2886],{},"*.example.com"," for any name under it that the domain's owner holds; a wildcard over a public suffix such as ",[1862,2889,2890],{},"*.github.io"," is refused). The edge fetches keys from no other host.",[2220,2893,2894,2899],{},[2238,2895,2896],{},[1862,2897,2898],{},"issuers",[2238,2900,2901,2902,2905],{},"The token's ",[1862,2903,2904],{},"iss"," must be one of them.",[2220,2907,2908,2913],{},[2238,2909,2910],{},[1862,2911,2912],{},"algorithms",[2238,2914,2901,2915,2918,2919,2922],{},[1862,2916,2917],{},"alg"," must be one of them: never ",[1862,2920,2921],{},"none"," and never an HMAC, whose secret would be the public key.",[2220,2924,2925,2933],{},[2238,2926,2927,2296,2930],{},[1862,2928,2929],{},"claims",[1862,2931,2932],{},"key_fields",[2238,2934,2935,2936,2939,2940,1915],{},"What reaches your function in the delivery's ",[1862,2937,2938],{},"verified"," object, checked: claims by name, the key's members as ",[1862,2941,2942],{},"key.\u003Cmember>",[1855,2944,2945,2946,2949,2950,2953,2954,2957,2958,2961,2962,2964,2965,2968,2969,2971],{},"The token must be signed by a key of the set its ",[1862,2947,2948],{},"kid"," names, with a key type that fits its algorithm; its ",[1862,2951,2952],{},"aud"," must be the secret's value (compared in constant time), and its ",[1862,2955,2956],{},"exp"," (required) and ",[1862,2959,2960],{},"nbf"," must hold within ",[1862,2963,2361],{},". The edge keeps a key set for the lifetime its ",[1862,2966,2967],{},"Cache-Control"," gives, between five minutes and a day, and fetches it again for a ",[1862,2970,2948],{}," it does not know at most once a minute, so a flood of tokens with made-up keys costs the sender, not your edge.",[1855,2973,2974,2975,2978,2979,2981,2982,2984,2985,2988],{},"Two sources share a kept set only when they name the same URL, read it the same way and allow the same key hosts, and a fetch that finds no key keeps the keys the set had, so another tenant's source cannot change yours. Keys come only over HTTPS with the certificate checked, from public addresses (private ones only in dev mode or on networks ",[1862,2976,2977],{},"--connect-allow-net"," lists), and each fetch is a row on ",[1869,2980,167],{"href":168},". A token that does not pass gets ",[1862,2983,1895],{}," and is audited as ",[1862,2986,2987],{},"event.refused"," once a minute; why it failed is logged without the token.",[1855,2990,2991,2992,2995,2996,2999,3000,3002,3003,3005],{},"Your function gets what the edge verified in ",[1862,2993,2994],{},"delivery[\"verified\"]",", and should check the body against it: Teams'\nplugin refuses an activity whose ",[1862,2997,2998],{},"serviceUrl"," is not the token's ",[1862,3001,2819],{}," claim, or whose channel the key's\n",[1862,3004,2836],{}," do not list.",[1855,3007,3008],{},"Set the secret, and point the sender at the edge:",[1922,3010,3015],{"className":3011,"code":3012,"filename":3013,"language":3014,"meta":1927,"style":1927},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","oz0 secret set GITHUB_WEBHOOK_SECRET --from-file ~\u002F.secrets\u002Fgithub-webhook --signing --host edge.example.com:7443\noz0 event sources\n","Terminal","bash",[1862,3016,3017,3045],{"__ignoreMap":1927},[1931,3018,3019,3022,3025,3028,3030,3033,3036,3039,3042],{"class":1933,"line":1934},[1931,3020,1714],{"class":3021},"sBMFI",[1931,3023,3024],{"class":1945}," secret",[1931,3026,3027],{"class":1945}," set",[1931,3029,2117],{"class":1945},[1931,3031,3032],{"class":1945}," --from-file",[1931,3034,3035],{"class":1945}," ~\u002F.secrets\u002Fgithub-webhook",[1931,3037,3038],{"class":1945}," --signing",[1931,3040,3041],{"class":1945}," --host",[1931,3043,3044],{"class":1945}," edge.example.com:7443\n",[1931,3046,3047,3049,3052],{"class":1933,"line":1949},[1931,3048,1714],{"class":3021},[1931,3050,3051],{"class":1945}," event",[1931,3053,3054],{"class":1945}," sources\n",[1922,3056,3061],{"className":3057,"code":3059,"language":3060,"meta":1927},[3058],"language-text","SOURCE  PLUGIN         SIGNATURE    SECRET                 PATH                    TYPES\ngithub  github-events  hmac-sha256  GITHUB_WEBHOOK_SECRET  \u002Fevents\u002Fdefault\u002Fgithub  pull_request, pull_request_review, check_suite, workflow_run, issue_comment\n","text",[1862,3062,3059],{"__ignoreMap":1927},[1855,3064,3065,3066,3069,3070,3073],{},"The edge takes a source's secret only as a signing key bound, by name, to one of its own addresses: the edge API's advertised address, its ",[1862,3067,3068],{},"--public-edge-url",", or a ",[1862,3071,3072],{},"--san"," name at the edge API's port, which the operator sets, never the host a request names. A secret a connection of the same plugin saved (a GitHub App's webhook secret, a Discord public key pasted in Connect) is taken as it is, unless that connection sends it as a credential: its token, the key its tokens are signed with, its client's secret or its refresh token.",[1855,3075,3076,3077,3079,3080,1915],{},"Any other secret, a credential such as a database's password, a key that signs what goes to another host or one bound by a wildcard, checks nothing, and every delivery gets the ",[1862,3078,1895],{}," a wrong signature gets, so whoever may name a source's secret cannot name another one and test guesses of it. The edge's log says why. Behind a proxy or load balancer, bind the key to the name senders use and give it to the edges as ",[1862,3081,3068],{},[1855,3083,3084,3085,3088,3089,3092],{},"In GitHub, add a webhook with the payload URL ",[1862,3086,3087],{},"https:\u002F\u002F\u003Cedge>:7443\u002Fevents\u002F\u003Ctenant>\u002Fgithub-events",", content type ",[1862,3090,3091],{},"application\u002Fjson"," and the same secret.",[1917,3094,3096],{"id":3095},"write-the-normalising-function","Write the normalising function",[1855,3098,3099,3100,1942],{},"The function gets one argument, ",[1862,3101,3102],{},"delivery",[2214,3104,3105,3114],{},[2217,3106,3107],{},[2220,3108,3109,3111],{},[2223,3110,2225],{},[2223,3112,3113],{},"What",[2233,3115,3116,3129,3142,3154,3171,3180,3191,3209],{},[2220,3117,3118,3126],{},[2238,3119,3120,2296,3123],{},[1862,3121,3122],{},"source",[1862,3124,3125],{},"id",[2238,3127,3128],{},"The source's name, and the delivery's ID",[2220,3130,3131,3136],{},[2238,3132,3133],{},[1862,3134,3135],{},"headers",[2238,3137,3138,3139,3141],{},"The request's headers, names in lowercase, without credentials and the signature (with scheme ",[1862,3140,2309],{},", with them)",[2220,3143,3144,3149],{},[2238,3145,3146],{},[1862,3147,3148],{},"content_type",[2238,3150,3151,3152],{},"Such as ",[1862,3153,3091],{},[2220,3155,3156,3161],{},[2238,3157,3158],{},[1862,3159,3160],{},"body",[2238,3162,3163,3164,3167,3168],{},"The body as JSON; for a form (",[1862,3165,3166],{},"application\u002Fx-www-form-urlencoded",") its fields, the first value of each; else ",[1862,3169,3170],{},"null",[2220,3172,3173,3177],{},[2238,3174,3175],{},[1862,3176,3060],{},[2238,3178,3179],{},"The body as text, when it is not JSON",[2220,3181,3182,3186],{},[2238,3183,3184],{},[1862,3185,2938],{},[2238,3187,3188,3189,2570],{},"The facts the edge checked, such as a token's claims (scheme ",[1862,3190,2302],{},[2220,3192,3193,3198],{},[2238,3194,3195],{},[1862,3196,3197],{},"seal",[2238,3199,3200,3201,3204,3205,3208],{},"The edge's ",[1869,3202,3197],{"href":3203},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding#carry-a-click-through-a-form"," of this delivery's facts, when the source declares one and its ",[1862,3206,3207],{},"when"," holds: carry it where the other system sends it back",[2220,3210,3211,3219],{},[2238,3212,3213,2296,3216],{},[1862,3214,3215],{},"sealed",[1862,3217,3218],{},"seal_refused",[2238,3220,3221],{},"The facts of the seal this delivery carried back, which the edge opened, or why the one it carried did not open",[1855,3223,3224],{},"It answers with structured content or JSON text:",[1922,3226,3230],{"className":3227,"code":3228,"language":3229,"meta":1927,"style":1927},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\"events\": [{\"type\": \"check_suite\", \"action\": \"completed\", \"subject\": \"octo\u002Fdemo#12\",\n             \"attributes\": {\"conclusion\": \"success\", \"head_sha\": \"abc123\"},\n             \"text\": \"check_suite github-actions on abc123: completed, success\"}]}\n","json",[1862,3231,3232,3304,3356],{"__ignoreMap":1927},[1931,3233,3234,3237,3239,3242,3244,3246,3249,3251,3254,3256,3258,3260,3263,3265,3267,3269,3272,3274,3276,3278,3281,3283,3285,3287,3290,3292,3294,3296,3299,3301],{"class":1933,"line":1934},[1931,3235,3236],{"class":1941},"{",[1931,3238,2017],{"class":1941},[1931,3240,2062],{"class":3241},"spNyl",[1931,3243,2017],{"class":1941},[1931,3245,1942],{"class":1941},[1931,3247,3248],{"class":1941}," [{",[1931,3250,2017],{"class":1941},[1931,3252,3253],{"class":3021},"type",[1931,3255,2017],{"class":1941},[1931,3257,1942],{"class":1941},[1931,3259,2028],{"class":1941},[1931,3261,3262],{"class":1945},"check_suite",[1931,3264,2017],{"class":1941},[1931,3266,2025],{"class":1941},[1931,3268,2028],{"class":1941},[1931,3270,3271],{"class":3021},"action",[1931,3273,2017],{"class":1941},[1931,3275,1942],{"class":1941},[1931,3277,2028],{"class":1941},[1931,3279,3280],{"class":1945},"completed",[1931,3282,2017],{"class":1941},[1931,3284,2025],{"class":1941},[1931,3286,2028],{"class":1941},[1931,3288,3289],{"class":3021},"subject",[1931,3291,2017],{"class":1941},[1931,3293,1942],{"class":1941},[1931,3295,2028],{"class":1941},[1931,3297,3298],{"class":1945},"octo\u002Fdemo#12",[1931,3300,2017],{"class":1941},[1931,3302,3303],{"class":1941},",\n",[1931,3305,3306,3309,3312,3314,3316,3319,3321,3324,3326,3328,3330,3333,3335,3337,3339,3342,3344,3346,3348,3351,3353],{"class":1933,"line":1949},[1931,3307,3308],{"class":1941},"             \"",[1931,3310,3311],{"class":3021},"attributes",[1931,3313,2017],{"class":1941},[1931,3315,1942],{"class":1941},[1931,3317,3318],{"class":1941}," {",[1931,3320,2017],{"class":1941},[1931,3322,3323],{"class":1968},"conclusion",[1931,3325,2017],{"class":1941},[1931,3327,1942],{"class":1941},[1931,3329,2028],{"class":1941},[1931,3331,3332],{"class":1945},"success",[1931,3334,2017],{"class":1941},[1931,3336,2025],{"class":1941},[1931,3338,2028],{"class":1941},[1931,3340,3341],{"class":1968},"head_sha",[1931,3343,2017],{"class":1941},[1931,3345,1942],{"class":1941},[1931,3347,2028],{"class":1941},[1931,3349,3350],{"class":1945},"abc123",[1931,3352,2017],{"class":1941},[1931,3354,3355],{"class":1941},"},\n",[1931,3357,3358,3360,3362,3364,3366,3368,3371,3373],{"class":1933,"line":1960},[1931,3359,3308],{"class":1941},[1931,3361,3060],{"class":3021},[1931,3363,2017],{"class":1941},[1931,3365,1942],{"class":1941},[1931,3367,2028],{"class":1941},[1931,3369,3370],{"class":1945},"check_suite github-actions on abc123: completed, success",[1931,3372,2017],{"class":1941},[1931,3374,3375],{"class":1941},"}]}\n",[3377,3378,3379,3386,3395,3400],"ul",{},[1890,3380,3381,1873,3383,3385],{},[1862,3382,3253],{},[1862,3384,3271],{}," say what happened in the source's own words: lowercase letters, digits, dots, dashes and underscores.",[1890,3387,3388,3390,3391,3394],{},[1862,3389,3289],{}," names what the event is about, one line of at most 200 bytes, such as ",[1862,3392,3393],{},"owner\u002Frepo#12"," for a pull request. Jobs wait for events by subject, so pick one that a job can know before the event comes.",[1890,3396,3397,3399],{},[1862,3398,3311],{}," are small typed fields that filters read, at most 8 KB as JSON.",[1890,3401,3402,3404],{},[1862,3403,3060],{}," is what a model reads of the event, at most 16 KB. It is outside text: whatever an issue's author wrote may be in it.",[1855,3406,3407,3408,3411,3412,3415,3416,3418,3419,2296,3421,2296,3423,3425,3426,2296,3429,3432,3433,3436],{},"One delivery may give up to 20 events, as many as its bindings tell apart: a check suite for two pull requests is one event for each, and binds their subjects as a list. A delivery that means nothing answers ",[1862,3409,3410],{},"{\"events\": [], \"ignore\": \"a ping\"}",", and one your function rejects answers ",[1862,3413,3414],{},"{\"refuse\": \"why\"}",", which the sender gets as ",[1862,3417,1895],{},". The edge adds ",[1862,3420,3122],{},[1862,3422,3102],{},[1862,3424,3125],{}," (the delivery's ID, with ",[1862,3427,3428],{},".1",[1862,3430,3431],{},".2"," for the second event on) and ",[1862,3434,3435],{},"at","; your function cannot set them, so it cannot speak for another source.",[1855,3438,3439,3440,3443],{},"The example in ",[1862,3441,3442],{},"examples\u002Fgithub-events"," currently requires repository access; public source downloads are coming soon. It reads pull requests, reviews, check suites, workflow runs and comments without any network or secret:",[1922,3445,3449],{"className":3446,"code":3447,"filename":3448,"language":2020,"meta":1927,"style":1927},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from typing import Any\n\nfrom mcp.server import MCPServer\nfrom mcp.types import ToolAnnotations\n\nfrom github_events.normalize import normalize as read_delivery\n\nserver = MCPServer(\"github-events\")\n\n\n@server.tool(annotations=ToolAnnotations(read_only_hint=True, idempotent_hint=True, open_world_hint=False))\ndef normalize(delivery: dict[str, Any]) -> dict[str, Any]:\n    \"\"\"Turn one GitHub webhook delivery, whose signature the edge checked, into normalised events.\"\"\"\n    return read_delivery(delivery)\n","src\u002Fgithub_events\u002Fserver.py",[1862,3450,3451,3456,3462,3467,3472,3476,3481,3485,3490,3494,3498,3503,3508,3513],{"__ignoreMap":1927},[1931,3452,3453],{"class":1933,"line":1934},[1931,3454,3455],{},"from typing import Any\n",[1931,3457,3458],{"class":1933,"line":1949},[1931,3459,3461],{"emptyLinePlaceholder":3460},true,"\n",[1931,3463,3464],{"class":1933,"line":1960},[1931,3465,3466],{},"from mcp.server import MCPServer\n",[1931,3468,3469],{"class":1933,"line":1972},[1931,3470,3471],{},"from mcp.types import ToolAnnotations\n",[1931,3473,3474],{"class":1933,"line":1983},[1931,3475,3461],{"emptyLinePlaceholder":3460},[1931,3477,3478],{"class":1933,"line":1992},[1931,3479,3480],{},"from github_events.normalize import normalize as read_delivery\n",[1931,3482,3483],{"class":1933,"line":2006},[1931,3484,3461],{"emptyLinePlaceholder":3460},[1931,3486,3487],{"class":1933,"line":2048},[1931,3488,3489],{},"server = MCPServer(\"github-events\")\n",[1931,3491,3492],{"class":1933,"line":2059},[1931,3493,3461],{"emptyLinePlaceholder":3460},[1931,3495,3496],{"class":1933,"line":2067},[1931,3497,3461],{"emptyLinePlaceholder":3460},[1931,3499,3500],{"class":1933,"line":2084},[1931,3501,3502],{},"@server.tool(annotations=ToolAnnotations(read_only_hint=True, idempotent_hint=True, open_world_hint=False))\n",[1931,3504,3505],{"class":1933,"line":2095},[1931,3506,3507],{},"def normalize(delivery: dict[str, Any]) -> dict[str, Any]:\n",[1931,3509,3510],{"class":1933,"line":2109},[1931,3511,3512],{},"    \"\"\"Turn one GitHub webhook delivery, whose signature the edge checked, into normalised events.\"\"\"\n",[1931,3514,3515],{"class":1933,"line":2123},[1931,3516,3517],{},"    return read_delivery(delivery)\n",[1855,3519,3520],{},"A normalising function should read the delivery and nothing else: the edge may call it again for a delivery that is sent again, and its time limit is a minute.",[1917,3522,3524],{"id":3523},"related-tasks","Related tasks",[3377,3526,3527,3532],{},[1890,3528,3529,3531],{},[1869,3530,769],{"href":770},": Bind event identities, carry forms and choose delivery responses.",[1890,3533,3534,3536],{},[1869,3535,773],{"href":774},": Connect chat channels, inventory changes and granted plugin results.",[3538,3539,3540],"legacy-sections",{},[3377,3541,3542,3552,3560,3568,3577,3586,3595],{},[1890,3543,3544,3548,3549],{},[1931,3545,3547],{"id":3546},"answer-at-once","Section",": ",[1869,3550,3551],{"href":2475},"answer at once",[1890,3553,3554,3548,3557],{},[1931,3555,3547],{"id":3556},"bind-events-to-the-delivery",[1869,3558,3559],{"href":2491},"bind events to the delivery",[1890,3561,3562,3548,3565],{},[1931,3563,3547],{"id":3564},"carry-a-click-through-a-form",[1869,3566,3567],{"href":3203},"carry a click through a form",[1890,3569,3570,3548,3573],{},[1931,3571,3547],{"id":3572},"chat-channels",[1869,3574,3576],{"href":3575},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fplatform-events#chat-channels","chat channels",[1890,3578,3579,3548,3582],{},[1931,3580,3547],{"id":3581},"how-deliveries-are-answered",[1869,3583,3585],{"href":3584},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding#how-deliveries-are-answered","how deliveries are answered",[1890,3587,3588,3548,3591],{},[1931,3589,3547],{"id":3590},"the-inventorys-changes",[1869,3592,3594],{"href":3593},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fplatform-events#the-inventorys-changes","the inventorys changes",[1890,3596,3597,3548,3600],{},[1931,3598,3547],{"id":3599},"the-results-of-granted-plugins",[1869,3601,3603],{"href":3602},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fplatform-events#the-results-of-granted-plugins","the results of granted plugins",[3605,3606,3607],"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":1927,"searchDepth":1949,"depth":1949,"links":3609},[3610,3613,3614],{"id":1919,"depth":1949,"text":1920,"children":3611},[3612],{"id":2665,"depth":1960,"text":2666},{"id":3095,"depth":1949,"text":3096},{"id":3523,"depth":1949,"text":3524},"Validate outside deliveries and turn them into events.","md",null,{"audience":3619,"doc_type":3620},"plugin authors","how-to",{"icon":767},{"title":762,"description":3615},"gmU9cKFhTIz7IXIMEIZ-8U-2gPsi5Rczv5Vs6qnhm84",[3625,3627],{"title":757,"path":758,"stem":759,"description":3626,"icon":760,"children":-1},"Your own checks before and after tool calls and at the start and end of a job.",{"title":769,"path":770,"stem":771,"description":3628,"icon":767,"children":-1},"Bind event identities, carry forms and choose delivery responses.",1794442979177]