[{"data":1,"prerenderedAt":1138},["ShallowReactive",2],{"navigation":3,"/ecosystem/proxy":145,"/ecosystem/proxy-surround":1133},[4,28,49,88,101,127],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","/getting-started","1.getting-started/1.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Working with Agents","/getting-started/working-with-agents","1.getting-started/2.working-with-agents",{"title":16,"path":17,"stem":18},"Setup a Service Provider","/getting-started/setup-service-provider","1.getting-started/3.setup-service-provider",{"title":20,"path":21,"stem":22},"Setup an Identity Provider","/getting-started/setup-identity-provider","1.getting-started/4.setup-identity-provider",{"title":24,"path":25,"stem":26},"Developers","/getting-started/developers","1.getting-started/5.developers",false,{"title":29,"icon":27,"path":30,"stem":31,"children":32,"page":27},"Guides","/guides","2.guides",[33,37,41,45],{"title":34,"path":35,"stem":36},"How It Works","/guides/how-it-works","2.guides/1.how-it-works",{"title":38,"path":39,"stem":40},"Capabilities Guide","/guides/capabilities-guide","2.guides/2.capabilities-guide",{"title":42,"path":43,"stem":44},"End-to-End Tutorial","/guides/end-to-end-tutorial","2.guides/3.end-to-end-tutorial",{"title":46,"path":47,"stem":48},"Delegation Guide","/guides/delegation-guide","2.guides/4.delegation-guide",{"title":50,"path":51,"stem":52,"children":53,"icon":27},"Ecosystem","/ecosystem","3.ecosystem/1.index",[54,56,60,64,68,72,76,80,84],{"title":55,"path":51,"stem":52},"Overview",{"title":57,"path":58,"stem":59},"grapes CLI","/ecosystem/grapes","3.ecosystem/2.grapes",{"title":61,"path":62,"stem":63},"shapes CLI","/ecosystem/shapes","3.ecosystem/3.shapes",{"title":65,"path":66,"stem":67},"escapes","/ecosystem/escapes","3.ecosystem/4.escapes",{"title":69,"path":70,"stem":71},"OpenApe Proxy","/ecosystem/proxy","3.ecosystem/5.proxy",{"title":73,"path":74,"stem":75},"OpenApe Browser","/ecosystem/browser","3.ecosystem/6.browser",{"title":77,"path":78,"stem":79},"OpenApe Auth","/ecosystem/auth","3.ecosystem/7.auth",{"title":81,"path":82,"stem":83},"OpenApe Grants","/ecosystem/grants","3.ecosystem/8.grants",{"title":85,"path":86,"stem":87},"nuxt-auth-sp","/ecosystem/nuxt-auth-sp","3.ecosystem/9.nuxt-auth-sp",{"title":89,"icon":27,"path":90,"stem":91,"children":92,"page":27},"Security","/security","4.security",[93,97],{"title":94,"path":95,"stem":96},"Compliance","/security/compliance","4.security/1.compliance",{"title":98,"path":99,"stem":100},"Threat Model","/security/threat-model","4.security/2.threat-model",{"title":102,"path":103,"stem":104,"children":105,"icon":27},"Reference","/reference","5.reference/1.index",[106,107,111,115,119,123],{"title":102,"path":103,"stem":104},{"title":108,"path":109,"stem":110},"IdP Configuration","/reference/idp-configuration","5.reference/2.idp-configuration",{"title":112,"path":113,"stem":114},"SP Configuration","/reference/sp-configuration","5.reference/3.sp-configuration",{"title":116,"path":117,"stem":118},"API Endpoints","/reference/api-endpoints","5.reference/4.api-endpoints",{"title":120,"path":121,"stem":122},"escapes Config","/reference/escapes-config","5.reference/5.escapes-config",{"title":124,"path":125,"stem":126},"Proxy Config","/reference/proxy-config","5.reference/6.proxy-config",{"title":128,"path":129,"stem":130,"children":131,"icon":27},"Operations","/operations","6.operations/1.index",[132,133,137,141],{"title":128,"path":129,"stem":130},{"title":134,"path":135,"stem":136},"Deployment","/operations/deployment","6.operations/2.deployment",{"title":138,"path":139,"stem":140},"Troubleshooting","/operations/troubleshooting","6.operations/3.troubleshooting",{"title":142,"path":143,"stem":144},"Monitoring","/operations/monitoring","6.operations/4.monitoring",{"id":146,"title":69,"body":147,"description":1127,"extension":1128,"links":1129,"meta":1130,"navigation":225,"path":70,"seo":1131,"stem":71,"__hash__":1132},"docs/3.ecosystem/5.proxy.md",{"type":148,"value":149,"toc":1110},"minimark",[150,155,159,164,193,197,269,273,280,395,400,511,515,556,560,563,601,605,608,688,694,732,736,739,813,817,820,1014,1018,1022,1070,1074,1106],[151,152,154],"h1",{"id":153},"openapeproxy","@openape/proxy",[156,157,158],"p",{},"A forward proxy that sits between an agent and the internet, enforcing grant-based access rules before forwarding requests. All traffic is logged for audit purposes.",[160,161,163],"h2",{"id":162},"installation","Installation",[165,166,171],"pre",{"className":167,"code":168,"language":169,"meta":170,"style":170},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install -g @openape/proxy\n","bash","",[172,173,174],"code",{"__ignoreMap":170},[175,176,179,183,187,190],"span",{"class":177,"line":178},"line",1,[175,180,182],{"class":181},"sBMFI","npm",[175,184,186],{"class":185},"sfazB"," install",[175,188,189],{"class":185}," -g",[175,191,192],{"class":185}," @openape/proxy\n",[160,194,196],{"id":195},"quick-start","Quick Start",[165,198,200],{"className":167,"code":199,"language":169,"meta":170,"style":170},"# Start the proxy\nopenape-proxy --config config.toml\n\n# Dry-run mode (evaluate rules without enforcing)\nopenape-proxy --config config.toml --dry-run\n\n# Require all requests to have agent authentication\nopenape-proxy --config config.toml --mandatory-auth\n",[172,201,202,208,220,227,233,246,251,257],{"__ignoreMap":170},[175,203,204],{"class":177,"line":178},[175,205,207],{"class":206},"sHwdD","# Start the proxy\n",[175,209,211,214,217],{"class":177,"line":210},2,[175,212,213],{"class":181},"openape-proxy",[175,215,216],{"class":185}," --config",[175,218,219],{"class":185}," config.toml\n",[175,221,223],{"class":177,"line":222},3,[175,224,226],{"emptyLinePlaceholder":225},true,"\n",[175,228,230],{"class":177,"line":229},4,[175,231,232],{"class":206},"# Dry-run mode (evaluate rules without enforcing)\n",[175,234,236,238,240,243],{"class":177,"line":235},5,[175,237,213],{"class":181},[175,239,216],{"class":185},[175,241,242],{"class":185}," config.toml",[175,244,245],{"class":185}," --dry-run\n",[175,247,249],{"class":177,"line":248},6,[175,250,226],{"emptyLinePlaceholder":225},[175,252,254],{"class":177,"line":253},7,[175,255,256],{"class":206},"# Require all requests to have agent authentication\n",[175,258,260,262,264,266],{"class":177,"line":259},8,[175,261,213],{"class":181},[175,263,216],{"class":185},[175,265,242],{"class":185},[175,267,268],{"class":185}," --mandatory-auth\n",[160,270,272],{"id":271},"configuration","Configuration",[156,274,275,276,279],{},"Create a ",[172,277,278],{},"config.toml"," file:",[165,281,285],{"className":282,"code":283,"language":284,"meta":170,"style":170},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","listen = \"127.0.0.1:9090\"\nidp_url = \"https://id.example.com\"\nagent_email = \"bot@example.com\"\ndefault_action = \"block\"  # block | request | request-async\naudit_log = \"/var/log/openape-proxy/audit.jsonl\"\n\n# Allow GET requests to GitHub API\n[[rules.allow]]\ndomains = [\"api.github.com\"]\nmethods = [\"GET\"]\n\n# Require a grant for write operations\n[[rules.grant_required]]\ndomains = [\"api.github.com\"]\nmethods = [\"POST\", \"PUT\", \"DELETE\"]\ngrant_type = \"once\"\n\n# Block internal network access\n[[rules.deny]]\ndomains = [\"*.internal.corp\"]\n","toml",[172,286,287,292,297,302,307,312,316,321,326,332,338,343,349,355,360,366,372,377,383,389],{"__ignoreMap":170},[175,288,289],{"class":177,"line":178},[175,290,291],{},"listen = \"127.0.0.1:9090\"\n",[175,293,294],{"class":177,"line":210},[175,295,296],{},"idp_url = \"https://id.example.com\"\n",[175,298,299],{"class":177,"line":222},[175,300,301],{},"agent_email = \"bot@example.com\"\n",[175,303,304],{"class":177,"line":229},[175,305,306],{},"default_action = \"block\"  # block | request | request-async\n",[175,308,309],{"class":177,"line":235},[175,310,311],{},"audit_log = \"/var/log/openape-proxy/audit.jsonl\"\n",[175,313,314],{"class":177,"line":248},[175,315,226],{"emptyLinePlaceholder":225},[175,317,318],{"class":177,"line":253},[175,319,320],{},"# Allow GET requests to GitHub API\n",[175,322,323],{"class":177,"line":259},[175,324,325],{},"[[rules.allow]]\n",[175,327,329],{"class":177,"line":328},9,[175,330,331],{},"domains = [\"api.github.com\"]\n",[175,333,335],{"class":177,"line":334},10,[175,336,337],{},"methods = [\"GET\"]\n",[175,339,341],{"class":177,"line":340},11,[175,342,226],{"emptyLinePlaceholder":225},[175,344,346],{"class":177,"line":345},12,[175,347,348],{},"# Require a grant for write operations\n",[175,350,352],{"class":177,"line":351},13,[175,353,354],{},"[[rules.grant_required]]\n",[175,356,358],{"class":177,"line":357},14,[175,359,331],{},[175,361,363],{"class":177,"line":362},15,[175,364,365],{},"methods = [\"POST\", \"PUT\", \"DELETE\"]\n",[175,367,369],{"class":177,"line":368},16,[175,370,371],{},"grant_type = \"once\"\n",[175,373,375],{"class":177,"line":374},17,[175,376,226],{"emptyLinePlaceholder":225},[175,378,380],{"class":177,"line":379},18,[175,381,382],{},"# Block internal network access\n",[175,384,386],{"class":177,"line":385},19,[175,387,388],{},"[[rules.deny]]\n",[175,390,392],{"class":177,"line":391},20,[175,393,394],{},"domains = [\"*.internal.corp\"]\n",[396,397,399],"h3",{"id":398},"configuration-fields","Configuration Fields",[401,402,403,422],"table",{},[404,405,406],"thead",{},[407,408,409,413,416,419],"tr",{},[410,411,412],"th",{},"Field",[410,414,415],{},"Required",[410,417,418],{},"Default",[410,420,421],{},"Description",[423,424,425,442,456,470,497],"tbody",{},[407,426,427,433,436,439],{},[428,429,430],"td",{},[172,431,432],{},"listen",[428,434,435],{},"Yes",[428,437,438],{},"—",[428,440,441],{},"Bind address and port",[407,443,444,449,451,453],{},[428,445,446],{},[172,447,448],{},"idp_url",[428,450,435],{},[428,452,438],{},[428,454,455],{},"IdP URL for grant requests",[407,457,458,463,465,467],{},[428,459,460],{},[172,461,462],{},"agent_email",[428,464,435],{},[428,466,438],{},[428,468,469],{},"Agent identity email",[407,471,472,477,480,485],{},[428,473,474],{},[172,475,476],{},"default_action",[428,478,479],{},"No",[428,481,482],{},[172,483,484],{},"block",[428,486,487,488,490,491,490,494],{},"Action for unmatched requests: ",[172,489,484],{},", ",[172,492,493],{},"request",[172,495,496],{},"request-async",[407,498,499,504,506,508],{},[428,500,501],{},[172,502,503],{},"audit_log",[428,505,479],{},[428,507,438],{},[428,509,510],{},"Path for JSONL audit log",[396,512,514],{"id":513},"default-actions","Default Actions",[401,516,517,527],{},[404,518,519],{},[407,520,521,524],{},[410,522,523],{},"Action",[410,525,526],{},"Behavior",[423,528,529,538,547],{},[407,530,531,535],{},[428,532,533],{},[172,534,484],{},[428,536,537],{},"Reject unmatched requests immediately",[407,539,540,544],{},[428,541,542],{},[172,543,493],{},[428,545,546],{},"Auto-request a grant and wait for approval",[407,548,549,553],{},[428,550,551],{},[172,552,496],{},[428,554,555],{},"Auto-request a grant, reject the current request, retry on next attempt",[160,557,559],{"id":558},"rule-evaluation","Rule Evaluation",[156,561,562],{},"Rules are evaluated in this order:",[564,565,566,576,584,592],"ol",{},[567,568,569,575],"li",{},[570,571,572],"strong",{},[172,573,574],{},"deny"," — If a deny rule matches, the request is blocked immediately",[567,577,578,583],{},[570,579,580],{},[172,581,582],{},"allow"," — If an allow rule matches, the request is forwarded",[567,585,586,591],{},[570,587,588],{},[172,589,590],{},"grant_required"," — If a grant rule matches, a grant must be approved before forwarding",[567,593,594,597,598,600],{},[570,595,596],{},"Default action"," — If no rule matches, the ",[172,599,476],{}," is applied",[396,602,604],{"id":603},"rule-fields","Rule Fields",[156,606,607],{},"Each rule can match on:",[401,609,610,624],{},[404,611,612],{},[407,613,614,616,619,621],{},[410,615,412],{},[410,617,618],{},"Type",[410,620,421],{},[410,622,623],{},"Example",[423,625,626,650,669],{},[407,627,628,633,638,645],{},[428,629,630],{},[172,631,632],{},"domains",[428,634,635],{},[172,636,637],{},"string[]",[428,639,640,641,644],{},"Domain patterns (supports ",[172,642,643],{},"*"," wildcard)",[428,646,647],{},[172,648,649],{},"[\"api.github.com\", \"*.aws.com\"]",[407,651,652,657,661,664],{},[428,653,654],{},[172,655,656],{},"methods",[428,658,659],{},[172,660,637],{},[428,662,663],{},"HTTP methods",[428,665,666],{},[172,667,668],{},"[\"GET\", \"POST\"]",[407,670,671,676,680,683],{},[428,672,673],{},[172,674,675],{},"paths",[428,677,678],{},[172,679,637],{},[428,681,682],{},"URL path patterns",[428,684,685],{},[172,686,687],{},"[\"/api/v1/*\"]",[156,689,690,691,693],{},"For ",[172,692,590],{}," rules, additionally:",[401,695,696,706],{},[404,697,698],{},[407,699,700,702,704],{},[410,701,412],{},[410,703,618],{},[410,705,421],{},[423,707,708],{},[407,709,710,715,720],{},[428,711,712],{},[172,713,714],{},"grant_type",[428,716,717],{},[172,718,719],{},"string",[428,721,722,723,490,726,490,729],{},"Required grant type: ",[172,724,725],{},"once",[172,727,728],{},"timed",[172,730,731],{},"always",[160,733,735],{"id":734},"multi-agent-configuration","Multi-Agent Configuration",[156,737,738],{},"For proxies serving multiple agents:",[165,740,742],{"className":282,"code":741,"language":284,"meta":170,"style":170},"[agents.deploy-bot]\nidp_url = \"https://id.example.com\"\nagent_email = \"agent+deploy@example.com\"\n\n[agents.monitor-bot]\nidp_url = \"https://id.example.com\"\nagent_email = \"agent+monitor@example.com\"\n\n# Agent-specific rules\n[[agents.deploy-bot.rules.allow]]\ndomains = [\"api.github.com\"]\nmethods = [\"GET\", \"POST\"]\n\n[[agents.monitor-bot.rules.allow]]\ndomains = [\"api.datadog.com\"]\n",[172,743,744,749,753,758,762,767,771,776,780,785,790,794,799,803,808],{"__ignoreMap":170},[175,745,746],{"class":177,"line":178},[175,747,748],{},"[agents.deploy-bot]\n",[175,750,751],{"class":177,"line":210},[175,752,296],{},[175,754,755],{"class":177,"line":222},[175,756,757],{},"agent_email = \"agent+deploy@example.com\"\n",[175,759,760],{"class":177,"line":229},[175,761,226],{"emptyLinePlaceholder":225},[175,763,764],{"class":177,"line":235},[175,765,766],{},"[agents.monitor-bot]\n",[175,768,769],{"class":177,"line":248},[175,770,296],{},[175,772,773],{"class":177,"line":253},[175,774,775],{},"agent_email = \"agent+monitor@example.com\"\n",[175,777,778],{"class":177,"line":259},[175,779,226],{"emptyLinePlaceholder":225},[175,781,782],{"class":177,"line":328},[175,783,784],{},"# Agent-specific rules\n",[175,786,787],{"class":177,"line":334},[175,788,789],{},"[[agents.deploy-bot.rules.allow]]\n",[175,791,792],{"class":177,"line":340},[175,793,331],{},[175,795,796],{"class":177,"line":345},[175,797,798],{},"methods = [\"GET\", \"POST\"]\n",[175,800,801],{"class":177,"line":351},[175,802,226],{"emptyLinePlaceholder":225},[175,804,805],{"class":177,"line":357},[175,806,807],{},"[[agents.monitor-bot.rules.allow]]\n",[175,809,810],{"class":177,"line":362},[175,811,812],{},"domains = [\"api.datadog.com\"]\n",[160,814,816],{"id":815},"audit-logging","Audit Logging",[156,818,819],{},"Every request is logged as JSONL:",[165,821,825],{"className":822,"code":823,"language":824,"meta":170,"style":170},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"timestamp\": \"2025-01-15T10:30:00Z\",\n  \"agent\": \"agent+deploy@example.com\",\n  \"method\": \"POST\",\n  \"url\": \"https://api.github.com/repos/org/repo/releases\",\n  \"rule\": \"grant_required\",\n  \"grant_id\": \"abc123\",\n  \"decision\": \"allowed\",\n  \"status\": 201,\n  \"duration_ms\": 342\n}\n","json",[172,826,827,833,859,879,899,919,938,958,978,995,1009],{"__ignoreMap":170},[175,828,829],{"class":177,"line":178},[175,830,832],{"class":831},"sMK4o","{\n",[175,834,835,838,842,845,848,851,854,856],{"class":177,"line":210},[175,836,837],{"class":831},"  \"",[175,839,841],{"class":840},"spNyl","timestamp",[175,843,844],{"class":831},"\"",[175,846,847],{"class":831},":",[175,849,850],{"class":831}," \"",[175,852,853],{"class":185},"2025-01-15T10:30:00Z",[175,855,844],{"class":831},[175,857,858],{"class":831},",\n",[175,860,861,863,866,868,870,872,875,877],{"class":177,"line":222},[175,862,837],{"class":831},[175,864,865],{"class":840},"agent",[175,867,844],{"class":831},[175,869,847],{"class":831},[175,871,850],{"class":831},[175,873,874],{"class":185},"agent+deploy@example.com",[175,876,844],{"class":831},[175,878,858],{"class":831},[175,880,881,883,886,888,890,892,895,897],{"class":177,"line":229},[175,882,837],{"class":831},[175,884,885],{"class":840},"method",[175,887,844],{"class":831},[175,889,847],{"class":831},[175,891,850],{"class":831},[175,893,894],{"class":185},"POST",[175,896,844],{"class":831},[175,898,858],{"class":831},[175,900,901,903,906,908,910,912,915,917],{"class":177,"line":235},[175,902,837],{"class":831},[175,904,905],{"class":840},"url",[175,907,844],{"class":831},[175,909,847],{"class":831},[175,911,850],{"class":831},[175,913,914],{"class":185},"https://api.github.com/repos/org/repo/releases",[175,916,844],{"class":831},[175,918,858],{"class":831},[175,920,921,923,926,928,930,932,934,936],{"class":177,"line":248},[175,922,837],{"class":831},[175,924,925],{"class":840},"rule",[175,927,844],{"class":831},[175,929,847],{"class":831},[175,931,850],{"class":831},[175,933,590],{"class":185},[175,935,844],{"class":831},[175,937,858],{"class":831},[175,939,940,942,945,947,949,951,954,956],{"class":177,"line":253},[175,941,837],{"class":831},[175,943,944],{"class":840},"grant_id",[175,946,844],{"class":831},[175,948,847],{"class":831},[175,950,850],{"class":831},[175,952,953],{"class":185},"abc123",[175,955,844],{"class":831},[175,957,858],{"class":831},[175,959,960,962,965,967,969,971,974,976],{"class":177,"line":259},[175,961,837],{"class":831},[175,963,964],{"class":840},"decision",[175,966,844],{"class":831},[175,968,847],{"class":831},[175,970,850],{"class":831},[175,972,973],{"class":185},"allowed",[175,975,844],{"class":831},[175,977,858],{"class":831},[175,979,980,982,985,987,989,993],{"class":177,"line":328},[175,981,837],{"class":831},[175,983,984],{"class":840},"status",[175,986,844],{"class":831},[175,988,847],{"class":831},[175,990,992],{"class":991},"sbssI"," 201",[175,994,858],{"class":831},[175,996,997,999,1002,1004,1006],{"class":177,"line":334},[175,998,837],{"class":831},[175,1000,1001],{"class":840},"duration_ms",[175,1003,844],{"class":831},[175,1005,847],{"class":831},[175,1007,1008],{"class":991}," 342\n",[175,1010,1011],{"class":177,"line":340},[175,1012,1013],{"class":831},"}\n",[160,1015,1017],{"id":1016},"common-patterns","Common Patterns",[396,1019,1021],{"id":1020},"allow-reads-require-grants-for-writes","Allow reads, require grants for writes",[165,1023,1025],{"className":282,"code":1024,"language":284,"meta":170,"style":170},"default_action = \"block\"\n\n[[rules.allow]]\ndomains = [\"api.github.com\"]\nmethods = [\"GET\", \"HEAD\", \"OPTIONS\"]\n\n[[rules.grant_required]]\ndomains = [\"api.github.com\"]\nmethods = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"]\ngrant_type = \"once\"\n",[172,1026,1027,1032,1036,1040,1044,1049,1053,1057,1061,1066],{"__ignoreMap":170},[175,1028,1029],{"class":177,"line":178},[175,1030,1031],{},"default_action = \"block\"\n",[175,1033,1034],{"class":177,"line":210},[175,1035,226],{"emptyLinePlaceholder":225},[175,1037,1038],{"class":177,"line":222},[175,1039,325],{},[175,1041,1042],{"class":177,"line":229},[175,1043,331],{},[175,1045,1046],{"class":177,"line":235},[175,1047,1048],{},"methods = [\"GET\", \"HEAD\", \"OPTIONS\"]\n",[175,1050,1051],{"class":177,"line":248},[175,1052,226],{"emptyLinePlaceholder":225},[175,1054,1055],{"class":177,"line":253},[175,1056,354],{},[175,1058,1059],{"class":177,"line":259},[175,1060,331],{},[175,1062,1063],{"class":177,"line":328},[175,1064,1065],{},"methods = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"]\n",[175,1067,1068],{"class":177,"line":334},[175,1069,371],{},[396,1071,1073],{"id":1072},"block-sensitive-endpoints","Block sensitive endpoints",[165,1075,1077],{"className":282,"code":1076,"language":284,"meta":170,"style":170},"[[rules.deny]]\ndomains = [\"*.internal.corp\", \"metadata.google.internal\"]\n\n[[rules.deny]]\ndomains = [\"*\"]\npaths = [\"/admin/*\", \"/.env\", \"/secrets/*\"]\n",[172,1078,1079,1083,1088,1092,1096,1101],{"__ignoreMap":170},[175,1080,1081],{"class":177,"line":178},[175,1082,388],{},[175,1084,1085],{"class":177,"line":210},[175,1086,1087],{},"domains = [\"*.internal.corp\", \"metadata.google.internal\"]\n",[175,1089,1090],{"class":177,"line":222},[175,1091,226],{"emptyLinePlaceholder":225},[175,1093,1094],{"class":177,"line":229},[175,1095,388],{},[175,1097,1098],{"class":177,"line":235},[175,1099,1100],{},"domains = [\"*\"]\n",[175,1102,1103],{"class":177,"line":248},[175,1104,1105],{},"paths = [\"/admin/*\", \"/.env\", \"/secrets/*\"]\n",[1107,1108,1109],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .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 .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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":170,"searchDepth":222,"depth":210,"links":1111},[1112,1113,1114,1118,1121,1122,1123],{"id":162,"depth":210,"text":163},{"id":195,"depth":210,"text":196},{"id":271,"depth":210,"text":272,"children":1115},[1116,1117],{"id":398,"depth":222,"text":399},{"id":513,"depth":222,"text":514},{"id":558,"depth":210,"text":559,"children":1119},[1120],{"id":603,"depth":222,"text":604},{"id":734,"depth":210,"text":735},{"id":815,"depth":210,"text":816},{"id":1016,"depth":210,"text":1017,"children":1124},[1125,1126],{"id":1020,"depth":222,"text":1021},{"id":1072,"depth":222,"text":1073},"Agent HTTP gateway with grant-based access control.","md",null,{},{"title":69,"description":1127},"BzuJv2Twv0GsqOeosVB1WAMkun9klUvgE7WnJ3SbIy0",[1134,1136],{"title":65,"path":66,"stem":67,"description":1135,"children":-1},"Setuid-root Rust binary for local privilege elevation via AuthZ-JWT.",{"title":73,"path":74,"stem":75,"description":1137,"children":-1},"Grant-aware headless browser with route interception and delegation login.",1774221117376]