[{"data":1,"prerenderedAt":1849},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-eve-extension":93,"-frameworks-eve-extension-surround":1844},[4,26,53,81],{"title":5,"path":6,"stem":7,"children":8,"page":25},"Getting Started","\u002Fgetting-started","docs",[9,13,17,21],{"title":10,"path":11,"stem":12},"Introduction","\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction",{"title":14,"path":15,"stem":16},"Installation","\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":18,"path":19,"stem":20},"Quick Start","\u002Fgetting-started\u002Fquick-start","docs\u002F1.getting-started\u002F3.quick-start",{"title":22,"path":23,"stem":24},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","docs\u002F1.getting-started\u002F4.agent-skills",false,{"title":27,"path":28,"stem":7,"children":29,"page":25},"Frameworks","\u002Fframeworks",[30,35,39,44,48],{"title":31,"path":32,"stem":33,"icon":34},"eve extension","\u002Fframeworks\u002Feve-extension","docs\u002F2.frameworks\u002F1.eve-extension","i-custom:eve",{"title":36,"path":37,"stem":38,"icon":34},"eve (direct import)","\u002Fframeworks\u002Feve","docs\u002F2.frameworks\u002F2.eve",{"title":40,"path":41,"stem":42,"icon":43},"AI SDK","\u002Fframeworks\u002Fai-sdk","docs\u002F2.frameworks\u002F3.ai-sdk","i-simple-icons-vercel",{"title":45,"path":46,"stem":47,"icon":43},"Vercel Workflow","\u002Fframeworks\u002Fvercel-workflow","docs\u002F2.frameworks\u002F4.vercel-workflow",{"title":49,"path":50,"stem":51,"icon":52},"Chat SDK","\u002Fframeworks\u002Fchat-sdk","docs\u002F2.frameworks\u002F5.chat-sdk","i-lucide-message-square",{"title":54,"path":55,"stem":7,"children":56,"page":25},"Guide","\u002Fguide",[57,61,65,69,73,77],{"title":58,"path":59,"stem":60},"Scope with Presets","\u002Fguide\u002Fpresets","docs\u002F3.guide\u002F1.presets",{"title":62,"path":63,"stem":64},"Control Write Safety","\u002Fguide\u002Fapproval-control","docs\u002F3.guide\u002F2.approval-control",{"title":66,"path":67,"stem":68},"Commit Attribution","\u002Fguide\u002Fcommit-attribution","docs\u002F3.guide\u002F3.commit-attribution",{"title":70,"path":71,"stem":72},"Tokens & Auth","\u002Fguide\u002Ftokens-and-auth","docs\u002F3.guide\u002F4.tokens-and-auth",{"title":74,"path":75,"stem":76},"Examples","\u002Fguide\u002Fexamples","docs\u002F3.guide\u002F5.examples",{"title":78,"path":79,"stem":80},"Vercel Connect","\u002Fguide\u002Fvercel-connect","docs\u002F3.guide\u002F6.vercel-connect",{"title":82,"path":83,"stem":7,"children":84,"page":25},"Api","\u002Fapi",[85,89],{"title":86,"path":87,"stem":88},"Tools Catalog","\u002Fapi\u002Ftools-catalog","docs\u002F4.api\u002F1.tools-catalog",{"title":90,"path":91,"stem":92},"API Reference","\u002Fapi\u002Freference","docs\u002F4.api\u002F2.reference",{"id":94,"title":95,"body":96,"description":1826,"extension":196,"links":1827,"meta":1839,"navigation":1840,"path":32,"seo":1841,"stem":33,"__hash__":1843},"docs\u002Fdocs\u002F2.frameworks\u002F1.eve-extension.md","Build a GitHub agent with the eve extension",{"type":97,"value":98,"toc":1813},"minimark",[99,132,151,179,184,187,366,369,389,404,408,426,438,452,465,469,475,612,634,665,669,681,762,778,840,854,926,930,1150,1154,1161,1243,1258,1261,1274,1343,1357,1382,1386,1389,1454,1463,1467,1478,1570,1582,1586,1766,1770,1809],[100,101,102,109,110,114,115,119,120,123,124,127,128,131],"p",{},[103,104,108],"a",{"href":105,"rel":106},"https:\u002F\u002Feve.dev",[107],"nofollow","eve"," is Vercel's filesystem-first agent framework: an agent is a folder with instructions, a model config, and tools. ",[111,112,113],"code",{},"@github-tools\u002Feve-extension"," packages all 42 GitHub tools as a mountable ",[103,116,31],{"href":117,"rel":118},"https:\u002F\u002Feve.dev\u002Fdocs\u002Fextensions",[107]," — a single ",[111,121,122],{},"pnpm add"," and a one-line mount under ",[111,125,126],{},"agent\u002Fextensions\u002F",", no CLI setup, and no direct SDK import in ",[111,129,130],{},"agent\u002Ftools\u002F",".",[133,134,135,136,140,141,146,147,150],"callout",{"icon":34},"This is the ",[137,138,139],"strong",{},"recommended way"," to add GitHub tools to an eve agent. The lower-level direct import, ",[103,142,143],{"href":37},[111,144,145],{},"@github-tools\u002Fsdk\u002Feve",", is ",[137,148,149],{},"deprecated"," in its favor — it keeps working, but new agents should mount the extension instead.",[152,153,156,159],"prompt",{":actions":154,"description":155,"icon":34},"[\"copy\",\"cursor\",\"windsurf\"]","Add GitHub tools to an eve agent via the extension",[100,157,158],{},"Add GitHub tools to an eve agent using the @github-tools\u002Feve-extension.",[160,161,162,166,169,176],"ul",{},[163,164,165],"li",{},"Install eve and @github-tools\u002Feve-extension (ai v7 and zod come along as transitive deps); set GITHUB_TOKEN or configure a Vercel Connect connector",[163,167,168],{},"Create agent\u002Fextensions\u002Fgithub.ts exporting default githubExtension({ preset: 'code-review' })",[163,170,171,172],{},"Configure requireApproval with predicates where appropriate — ",[103,173,174],{"href":174,"rel":175},"https:\u002F\u002Fgithub-tools.com\u002Fframeworks\u002Feve-extension",[107],[163,177,178],{},"Use examples\u002Feve-extension-agent as reference; run with pnpm dev:eve-extension-agent from the monorepo root",[180,181,183],"h2",{"id":182},"the-whole-agent","The whole agent",[100,185,186],{},"Three files. That's the entire thing:",[188,189,190,215,305],"code-group",{},[191,192,198],"pre",{"className":193,"code":194,"filename":195,"language":196,"meta":197,"style":197},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","You are a GitHub assistant. Use the GitHub tools to inspect repos, PRs, and issues.\nAsk before merging or closing anything destructive.\n","agent\u002Finstructions.md","md","",[111,199,200,209],{"__ignoreMap":197},[201,202,205],"span",{"class":203,"line":204},"line",1,[201,206,208],{"class":207},"sTEyZ","You are a GitHub assistant. Use the GitHub tools to inspect repos, PRs, and issues.\n",[201,210,212],{"class":203,"line":211},2,[201,213,214],{"class":207},"Ask before merging or closing anything destructive.\n",[191,216,221],{"className":217,"code":218,"filename":219,"language":220,"meta":197,"style":197},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineAgent } from 'eve'\n\nexport default defineAgent({\n  model: 'anthropic\u002Fclaude-sonnet-5',\n})\n","agent\u002Fagent.ts","ts",[111,222,223,251,257,275,296],{"__ignoreMap":197},[201,224,225,229,233,236,239,242,245,248],{"class":203,"line":204},[201,226,228],{"class":227},"s7zQu","import",[201,230,232],{"class":231},"sMK4o"," {",[201,234,235],{"class":207}," defineAgent",[201,237,238],{"class":231}," }",[201,240,241],{"class":227}," from",[201,243,244],{"class":231}," '",[201,246,108],{"class":247},"sfazB",[201,249,250],{"class":231},"'\n",[201,252,253],{"class":203,"line":211},[201,254,256],{"emptyLinePlaceholder":255},true,"\n",[201,258,260,263,266,269,272],{"class":203,"line":259},3,[201,261,262],{"class":227},"export",[201,264,265],{"class":227}," default",[201,267,235],{"class":268},"s2Zo4",[201,270,271],{"class":207},"(",[201,273,274],{"class":231},"{\n",[201,276,278,282,285,287,290,293],{"class":203,"line":277},4,[201,279,281],{"class":280},"swJcz","  model",[201,283,284],{"class":231},":",[201,286,244],{"class":231},[201,288,289],{"class":247},"anthropic\u002Fclaude-sonnet-5",[201,291,292],{"class":231},"'",[201,294,295],{"class":231},",\n",[201,297,299,302],{"class":203,"line":298},5,[201,300,301],{"class":231},"}",[201,303,304],{"class":207},")\n",[191,306,309],{"className":217,"code":307,"filename":308,"language":220,"meta":197,"style":197},"import githubExtension from '@github-tools\u002Feve-extension'\n\nexport default githubExtension({\n  preset: 'maintainer',\n})\n","agent\u002Fextensions\u002Fgithub.ts",[111,310,311,327,331,344,360],{"__ignoreMap":197},[201,312,313,315,318,321,323,325],{"class":203,"line":204},[201,314,228],{"class":227},[201,316,317],{"class":207}," githubExtension ",[201,319,320],{"class":227},"from",[201,322,244],{"class":231},[201,324,113],{"class":247},[201,326,250],{"class":231},[201,328,329],{"class":203,"line":211},[201,330,256],{"emptyLinePlaceholder":255},[201,332,333,335,337,340,342],{"class":203,"line":259},[201,334,262],{"class":227},[201,336,265],{"class":227},[201,338,339],{"class":268}," githubExtension",[201,341,271],{"class":207},[201,343,274],{"class":231},[201,345,346,349,351,353,356,358],{"class":203,"line":277},[201,347,348],{"class":280},"  preset",[201,350,284],{"class":231},[201,352,244],{"class":231},[201,354,355],{"class":247},"maintainer",[201,357,292],{"class":231},[201,359,295],{"class":231},[201,361,362,364],{"class":203,"line":298},[201,363,301],{"class":231},[201,365,304],{"class":207},[100,367,368],{},"Run it:",[191,370,375],{"className":371,"code":372,"filename":373,"language":374,"meta":197,"style":197},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx eve dev\n","Terminal","bash",[111,376,377],{"__ignoreMap":197},[201,378,379,383,386],{"class":203,"line":204},[201,380,382],{"class":381},"sBMFI","npx",[201,384,385],{"class":247}," eve",[201,387,388],{"class":247}," dev\n",[100,390,391,392,399,400,403],{},"You now have a GitHub agent that can read repos, review PRs, triage issues, and manage CI — with every write operation gated behind durable approval by default. The full example lives in ",[103,393,396],{"href":394,"rel":395},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fgithub-tools\u002Ftree\u002Fmain\u002Fexamples\u002Feve-extension-agent",[107],[111,397,398],{},"examples\u002Feve-extension-agent\u002F"," (or ",[111,401,402],{},"pnpm dev:eve-extension-agent"," from the monorepo root).",[180,405,407],{"id":406},"install","Install",[191,409,414],{"className":410,"code":411,"filename":412,"language":413,"meta":197,"style":197},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @github-tools\u002Feve-extension\n","pnpm","sh",[111,415,416],{"__ignoreMap":197},[201,417,418,420,423],{"class":203,"line":204},[201,419,412],{"class":381},[201,421,422],{"class":247}," add",[201,424,425],{"class":247}," @github-tools\u002Feve-extension\n",[100,427,428,430,431,437],{},[111,429,108],{}," is a required peer dependency (which itself requires ",[137,432,433,436],{},[111,434,435],{},"ai"," v7","):",[191,439,441],{"className":410,"code":440,"filename":412,"language":413,"meta":197,"style":197},"pnpm add eve\n",[111,442,443],{"__ignoreMap":197},[201,444,445,447,449],{"class":203,"line":204},[201,446,412],{"class":381},[201,448,422],{"class":247},[201,450,451],{"class":247}," eve\n",[100,453,454,455,458,459,462,463,131],{},"You still need ",[111,456,457],{},"GITHUB_TOKEN"," (or a Vercel Connect ",[111,460,461],{},"connector",", below). See ",[103,464,14],{"href":15},[180,466,468],{"id":467},"mount-it","Mount it",[100,470,471,472,474],{},"Drop a file under ",[111,473,126],{}," — the filename becomes the tool namespace:",[191,476,478],{"className":217,"code":477,"filename":308,"language":220,"meta":197,"style":197},"import githubExtension from '@github-tools\u002Feve-extension'\n\nexport default githubExtension({\n  connector: 'github\u002Fmy-connector', \u002F\u002F or token: process.env.GITHUB_TOKEN\n  preset: 'code-review',\n  requireApproval: {\n    addPullRequestComment: ({ toolInput }) => toolInput?.owner !== 'vercel-labs',\n  },\n})\n",[111,479,480,494,498,510,531,546,557,599,605],{"__ignoreMap":197},[201,481,482,484,486,488,490,492],{"class":203,"line":204},[201,483,228],{"class":227},[201,485,317],{"class":207},[201,487,320],{"class":227},[201,489,244],{"class":231},[201,491,113],{"class":247},[201,493,250],{"class":231},[201,495,496],{"class":203,"line":211},[201,497,256],{"emptyLinePlaceholder":255},[201,499,500,502,504,506,508],{"class":203,"line":259},[201,501,262],{"class":227},[201,503,265],{"class":227},[201,505,339],{"class":268},[201,507,271],{"class":207},[201,509,274],{"class":231},[201,511,512,515,517,519,522,524,527],{"class":203,"line":277},[201,513,514],{"class":280},"  connector",[201,516,284],{"class":231},[201,518,244],{"class":231},[201,520,521],{"class":247},"github\u002Fmy-connector",[201,523,292],{"class":231},[201,525,526],{"class":231},",",[201,528,530],{"class":529},"sHwdD"," \u002F\u002F or token: process.env.GITHUB_TOKEN\n",[201,532,533,535,537,539,542,544],{"class":203,"line":298},[201,534,348],{"class":280},[201,536,284],{"class":231},[201,538,244],{"class":231},[201,540,541],{"class":247},"code-review",[201,543,292],{"class":231},[201,545,295],{"class":231},[201,547,549,552,554],{"class":203,"line":548},6,[201,550,551],{"class":280},"  requireApproval",[201,553,284],{"class":231},[201,555,556],{"class":231}," {\n",[201,558,560,563,565,568,572,575,579,581,584,587,590,592,595,597],{"class":203,"line":559},7,[201,561,562],{"class":268},"    addPullRequestComment",[201,564,284],{"class":231},[201,566,567],{"class":231}," ({",[201,569,571],{"class":570},"sHdIc"," toolInput",[201,573,574],{"class":231}," })",[201,576,578],{"class":577},"spNyl"," =>",[201,580,571],{"class":207},[201,582,583],{"class":231},"?.",[201,585,586],{"class":207},"owner ",[201,588,589],{"class":231},"!==",[201,591,244],{"class":231},[201,593,594],{"class":247},"vercel-labs",[201,596,292],{"class":231},[201,598,295],{"class":231},[201,600,602],{"class":203,"line":601},8,[201,603,604],{"class":231},"  },\n",[201,606,608,610],{"class":203,"line":607},9,[201,609,301],{"class":231},[201,611,304],{"class":207},[100,613,614,615,618,619,622,623,625,626,629,630,633],{},"Tools are exposed to the model as ",[111,616,617],{},"\u003Cnamespace>__\u003CtoolName>",", where ",[111,620,621],{},"\u003Cnamespace>"," comes from the mount file's name — ",[111,624,308],{}," yields ",[111,627,628],{},"github__listPullRequests",", ",[111,631,632],{},"github__createIssue",", and so on.",[100,635,636,638,639,641,642,644,645,648,649,652,653,656,657,660,661,664],{},[111,637,541],{}," is used above (rather than ",[111,640,355],{},") because it pairs cleanly with a Connect connector — ",[111,643,355],{}," and ",[111,646,647],{},"repo-explorer"," include gist tools, and GitHub only grants gist access to user access tokens, never the installation tokens Connect mints, so gist calls 403 over Connect (see ",[103,650,70],{"href":651},"\u002Fguide\u002Ftokens-and-auth#map-permissions-to-presets","). The ",[111,654,655],{},"requireApproval"," predicate above is a real gate, not a no-op: write tools already require approval by ",[111,658,659],{},"always()"," by default, so ",[111,662,663],{},"{ mergePullRequest: true }"," would change nothing — a predicate is what actually narrows or loosens the default.",[180,666,668],{"id":667},"pick-exact-tools","Pick exact tools",[100,670,671,674,675,644,678,284],{},[111,672,673],{},"preset"," scopes to one of five predefined groups. To hand-pick tools instead — standalone, or layered on top of a preset — use ",[111,676,677],{},"include",[111,679,680],{},"exclude",[191,682,684],{"className":217,"code":683,"filename":308,"language":220,"meta":197,"style":197},"import githubExtension from '@github-tools\u002Feve-extension'\n\nexport default githubExtension({\n  include: ['getRepository', 'listPullRequests', 'mergePullRequest'],\n})\n",[111,685,686,700,704,716,756],{"__ignoreMap":197},[201,687,688,690,692,694,696,698],{"class":203,"line":204},[201,689,228],{"class":227},[201,691,317],{"class":207},[201,693,320],{"class":227},[201,695,244],{"class":231},[201,697,113],{"class":247},[201,699,250],{"class":231},[201,701,702],{"class":203,"line":211},[201,703,256],{"emptyLinePlaceholder":255},[201,705,706,708,710,712,714],{"class":203,"line":259},[201,707,262],{"class":227},[201,709,265],{"class":227},[201,711,339],{"class":268},[201,713,271],{"class":207},[201,715,274],{"class":231},[201,717,718,721,723,726,728,731,733,735,737,740,742,744,746,749,751,754],{"class":203,"line":277},[201,719,720],{"class":280},"  include",[201,722,284],{"class":231},[201,724,725],{"class":207}," [",[201,727,292],{"class":231},[201,729,730],{"class":247},"getRepository",[201,732,292],{"class":231},[201,734,526],{"class":231},[201,736,244],{"class":231},[201,738,739],{"class":247},"listPullRequests",[201,741,292],{"class":231},[201,743,526],{"class":231},[201,745,244],{"class":231},[201,747,748],{"class":247},"mergePullRequest",[201,750,292],{"class":231},[201,752,753],{"class":207},"]",[201,755,295],{"class":231},[201,757,758,760],{"class":203,"line":298},[201,759,301],{"class":231},[201,761,304],{"class":207},[100,763,764,766,767,770,771,773,774,777],{},[111,765,677],{}," ",[137,768,769],{},"adds"," to ",[111,772,673],{}," — the effective set is the ",[137,775,776],{},"union"," of both, so you can pull in a tool a preset is missing without switching to a bigger preset:",[191,779,781],{"className":217,"code":780,"filename":308,"language":220,"meta":197,"style":197},"export default githubExtension({\n  preset: 'code-review', \u002F\u002F read-only PR review tools\n  include: ['createIssue'], \u002F\u002F + one write tool code-review doesn't include\n})\n",[111,782,783,795,812,834],{"__ignoreMap":197},[201,784,785,787,789,791,793],{"class":203,"line":204},[201,786,262],{"class":227},[201,788,265],{"class":227},[201,790,339],{"class":268},[201,792,271],{"class":207},[201,794,274],{"class":231},[201,796,797,799,801,803,805,807,809],{"class":203,"line":211},[201,798,348],{"class":280},[201,800,284],{"class":231},[201,802,244],{"class":231},[201,804,541],{"class":247},[201,806,292],{"class":231},[201,808,526],{"class":231},[201,810,811],{"class":529}," \u002F\u002F read-only PR review tools\n",[201,813,814,816,818,820,822,825,827,829,831],{"class":203,"line":259},[201,815,720],{"class":280},[201,817,284],{"class":231},[201,819,725],{"class":207},[201,821,292],{"class":231},[201,823,824],{"class":247},"createIssue",[201,826,292],{"class":231},[201,828,753],{"class":207},[201,830,526],{"class":231},[201,832,833],{"class":529}," \u002F\u002F + one write tool code-review doesn't include\n",[201,835,836,838],{"class":203,"line":277},[201,837,301],{"class":231},[201,839,304],{"class":207},[100,841,842,766,844,847,848,850,851,853],{},[111,843,680],{},[137,845,846],{},"removes"," tool names from whatever ",[111,849,673],{}," + ",[111,852,677],{}," resolved to — useful for dropping a couple of tools you don't want exposed from a larger preset:",[191,855,857],{"className":217,"code":856,"filename":308,"language":220,"meta":197,"style":197},"export default githubExtension({\n  preset: 'maintainer', \u002F\u002F all 42 tools\n  exclude: ['createRepository', 'deleteGist'], \u002F\u002F minus these two\n})\n",[111,858,859,871,888,920],{"__ignoreMap":197},[201,860,861,863,865,867,869],{"class":203,"line":204},[201,862,262],{"class":227},[201,864,265],{"class":227},[201,866,339],{"class":268},[201,868,271],{"class":207},[201,870,274],{"class":231},[201,872,873,875,877,879,881,883,885],{"class":203,"line":211},[201,874,348],{"class":280},[201,876,284],{"class":231},[201,878,244],{"class":231},[201,880,355],{"class":247},[201,882,292],{"class":231},[201,884,526],{"class":231},[201,886,887],{"class":529}," \u002F\u002F all 42 tools\n",[201,889,890,893,895,897,899,902,904,906,908,911,913,915,917],{"class":203,"line":259},[201,891,892],{"class":280},"  exclude",[201,894,284],{"class":231},[201,896,725],{"class":207},[201,898,292],{"class":231},[201,900,901],{"class":247},"createRepository",[201,903,292],{"class":231},[201,905,526],{"class":231},[201,907,244],{"class":231},[201,909,910],{"class":247},"deleteGist",[201,912,292],{"class":231},[201,914,753],{"class":207},[201,916,526],{"class":231},[201,918,919],{"class":529}," \u002F\u002F minus these two\n",[201,921,922,924],{"class":203,"line":277},[201,923,301],{"class":231},[201,925,304],{"class":207},[180,927,929],{"id":928},"config-schema","Config schema",[931,932,933,949],"table",{},[934,935,936],"thead",{},[937,938,939,943,946],"tr",{},[940,941,942],"th",{},"Field",[940,944,945],{},"Type",[940,947,948],{},"Notes",[950,951,952,974,990,1012,1039,1059,1077,1101,1129],"tbody",{},[937,953,954,960,965],{},[955,956,957],"td",{},[111,958,959],{},"token",[955,961,962],{},[111,963,964],{},"string?",[955,966,967,968,970,971,973],{},"Falls back to ",[111,969,457],{}," when omitted and ",[111,972,461],{}," is not set",[937,975,976,980,985],{},[955,977,978],{},[111,979,461],{},[955,981,982],{},[111,983,984],{},"string | (() => string | Promise\u003Cstring>)",[955,986,987,988],{},"Vercel Connect connector name, or a resolver to pick one dynamically (e.g. per environment\u002Ftenant); takes priority over ",[111,989,959],{},[937,991,992,997,1002],{},[955,993,994],{},[111,995,996],{},"connect",[955,998,999],{},[111,1000,1001],{},"record?",[955,1003,1004,1005,1008,1009,1011],{},"Passed through to ",[111,1006,1007],{},"getToken"," when ",[111,1010,461],{}," is set",[937,1013,1014,1018,1021],{},[955,1015,1016],{},[111,1017,673],{},[955,1019,1020],{},"preset name or array",[955,1022,1023,629,1025,629,1028,629,1031,629,1033,1035,1036],{},[111,1024,541],{},[111,1026,1027],{},"issue-triage",[111,1029,1030],{},"ci-ops",[111,1032,647],{},[111,1034,355],{}," — see ",[103,1037,1038],{"href":59},"Presets",[937,1040,1041,1045,1050],{},[955,1042,1043],{},[111,1044,677],{},[955,1046,1047],{},[111,1048,1049],{},"string[]?",[955,1051,1052,1053,1055,1056],{},"Tool names to add on top of ",[111,1054,673],{}," (union), or the full set standalone — see ",[103,1057,668],{"href":1058},"#pick-exact-tools",[937,1060,1061,1065,1069],{},[955,1062,1063],{},[111,1064,680],{},[955,1066,1067],{},[111,1068,1049],{},[955,1070,1071,1072,850,1074,1076],{},"Tool names to remove from the resolved ",[111,1073,673],{},[111,1075,677],{}," set",[937,1078,1079,1083,1088],{},[955,1080,1081],{},[111,1082,655],{},[955,1084,1085],{},[111,1086,1087],{},"boolean | record",[955,1089,1090,1091,629,1094,629,1097,1100],{},"Global or per-tool; per-tool values may be ",[111,1092,1093],{},"'once'",[111,1095,1096],{},"'always'",[111,1098,1099],{},"'never'",", or predicate functions",[937,1102,1103,1108,1113],{},[955,1104,1105],{},[111,1106,1107],{},"overrides",[955,1109,1110],{},[111,1111,1112],{},"record",[955,1114,1115,1116,1119,1120,1119,1123,1119,1126],{},"Per-tool ",[111,1117,1118],{},"description"," \u002F ",[111,1121,1122],{},"approval",[111,1124,1125],{},"toModelOutput",[111,1127,1128],{},"outputSchema",[937,1130,1131,1142,1145],{},[955,1132,1133,1119,1136,1119,1139],{},[111,1134,1135],{},"author",[111,1137,1138],{},"committer",[111,1140,1141],{},"coAuthors",[955,1143,1144],{},"commit identity",[955,1146,1147,1148],{},"Attribution for commit-creating tools — see ",[103,1149,66],{"href":67},[180,1151,1153],{"id":1152},"durable-approval-done-right","Durable approval, done right",[100,1155,1156,1157,1160],{},"Approval ",[137,1158,1159],{},"pauses the session durably"," until a human responds, and policies are expressive:",[931,1162,1163,1176],{},[934,1164,1165],{},[937,1166,1167,1170,1173],{},[940,1168,1169],{},"Value",[940,1171,1172],{},"Maps to",[940,1174,1175],{},"Behavior",[950,1177,1178,1194,1211,1225],{},[937,1179,1180,1187,1191],{},[955,1181,1182,1119,1185],{},[111,1183,1184],{},"true",[111,1186,1096],{},[955,1188,1189],{},[111,1190,659],{},[955,1192,1193],{},"Require approval on every call",[937,1195,1196,1203,1208],{},[955,1197,1198,1119,1201],{},[111,1199,1200],{},"false",[111,1202,1099],{},[955,1204,1205],{},[111,1206,1207],{},"never()",[955,1209,1210],{},"Skip approval",[937,1212,1213,1217,1222],{},[955,1214,1215],{},[111,1216,1093],{},[955,1218,1219],{},[111,1220,1221],{},"once()",[955,1223,1224],{},"Approve once per session, then auto-allow",[937,1226,1227,1230,1236],{},[955,1228,1229],{},"predicate",[955,1231,1232,1233],{},"custom ",[111,1234,1235],{},"Approval",[955,1237,1238,1239,1242],{},"Input-dependent gate (",[111,1240,1241],{},"toolInput",", session context)",[100,1244,1245,1246,1248,1249,1251,1252,1254,1255,131],{},"Default (no ",[111,1247,655],{},"): all write tools → ",[111,1250,659],{},". Unlisted write tools keep the ",[111,1253,659],{}," fail-safe default. Read tools never require approval. Details: ",[103,1256,1257],{"href":63},"Control write safety",[180,1259,78],{"id":1260},"vercel-connect",[100,1262,1263,1264,1266,1267,1269,1270,1273],{},"Skip ",[111,1265,457],{}," entirely and mint the token from a Connect connector — pass ",[111,1268,461],{}," directly in the mount config, no separate ",[111,1271,1272],{},"connectGithubTools"," import needed:",[191,1275,1277],{"className":217,"code":1276,"filename":308,"language":220,"meta":197,"style":197},"import githubExtension from '@github-tools\u002Feve-extension'\n\nexport default githubExtension({\n  connector: 'github\u002Fmy-connector',\n  preset: 'code-review',\n})\n",[111,1278,1279,1293,1297,1309,1323,1337],{"__ignoreMap":197},[201,1280,1281,1283,1285,1287,1289,1291],{"class":203,"line":204},[201,1282,228],{"class":227},[201,1284,317],{"class":207},[201,1286,320],{"class":227},[201,1288,244],{"class":231},[201,1290,113],{"class":247},[201,1292,250],{"class":231},[201,1294,1295],{"class":203,"line":211},[201,1296,256],{"emptyLinePlaceholder":255},[201,1298,1299,1301,1303,1305,1307],{"class":203,"line":259},[201,1300,262],{"class":227},[201,1302,265],{"class":227},[201,1304,339],{"class":268},[201,1306,271],{"class":207},[201,1308,274],{"class":231},[201,1310,1311,1313,1315,1317,1319,1321],{"class":203,"line":277},[201,1312,514],{"class":280},[201,1314,284],{"class":231},[201,1316,244],{"class":231},[201,1318,521],{"class":247},[201,1320,292],{"class":231},[201,1322,295],{"class":231},[201,1324,1325,1327,1329,1331,1333,1335],{"class":203,"line":298},[201,1326,348],{"class":280},[201,1328,284],{"class":231},[201,1330,244],{"class":231},[201,1332,541],{"class":247},[201,1334,292],{"class":231},[201,1336,295],{"class":231},[201,1338,1339,1341],{"class":203,"line":548},[201,1340,301],{"class":231},[201,1342,304],{"class":207},[100,1344,1345,1346,1349,1350,1352,1353,1356],{},"Unlike the deprecated direct import, no ",[111,1347,1348],{},"build.externalDependencies"," workaround is needed in ",[111,1351,219],{}," — the extension is pre-built via ",[111,1354,1355],{},"eve extension build"," and loaded through eve's extension mechanism rather than inlined from a workspace-linked source import.",[100,1358,1359,1362,1363,1365,1366,1368,1369,1372,1373,1377,1378,1381],{},[111,1360,1361],{},"@vercel\u002Fconnect"," is an optional peer dependency of the extension — install it only when using ",[111,1364,461],{},". ",[111,1367,461],{}," also accepts a ",[111,1370,1371],{},"() => string | Promise\u003Cstring>"," resolver for picking a connector per environment or tenant — see ",[103,1374,1376],{"href":1375},"\u002Fguide\u002Fvercel-connect#dynamic-connector-selection","dynamic connector selection",". See ",[103,1379,78],{"href":1380},"\u002Fguide\u002Fvercel-connect#eve-extension"," for the connector setup checklist and multi-tenant scoping.",[180,1383,1385],{"id":1384},"idempotency","Idempotency",[100,1387,1388],{},"eve replays completed steps but re-runs steps interrupted mid-execution:",[931,1390,1391,1400],{},[934,1392,1393],{},[937,1394,1395,1398],{},[940,1396,1397],{},"Tool",[940,1399,1385],{},[950,1401,1402,1416,1426,1436],{},[937,1403,1404,1409],{},[955,1405,1406],{},[111,1407,1408],{},"createOrUpdateFile",[955,1410,1411,1412,1415],{},"Natural when content + ",[111,1413,1414],{},"sha"," unchanged",[937,1417,1418,1423],{},[955,1419,1420],{},[111,1421,1422],{},"closeIssue",[955,1424,1425],{},"Natural when already closed",[937,1427,1428,1433],{},[955,1429,1430],{},[111,1431,1432],{},"createBranch",[955,1434,1435],{},"Natural when branch exists at same SHA",[937,1437,1438,1448],{},[955,1439,1440,629,1443,629,1445,1447],{},[111,1441,1442],{},"addIssueComment",[111,1444,824],{},[111,1446,748],{},", …",[955,1449,1450,1453],{},[137,1451,1452],{},"Not"," idempotent",[100,1455,1456,1457,1459,1460,1462],{},"Gate non-idempotent writes behind ",[111,1458,659],{}," or ",[111,1461,1221],{}," where replay safety matters.",[180,1464,1466],{"id":1465},"migrating-from-the-direct-import","Migrating from the direct import",[100,1468,1469,1470,1474,1475,1477],{},"If you have an existing agent using ",[103,1471,1472],{"href":37},[111,1473,145],{}," directly in ",[111,1476,130],{},", move to the extension in three steps:",[1479,1480,1481,1496,1533,1550],"ol",{},[163,1482,1483,1486,1487,1489,1490,1489,1492,1495],{},[111,1484,1485],{},"pnpm add @github-tools\u002Feve-extension"," and remove the now-unused direct ",[111,1488,108],{},"\u002F",[111,1491,435],{},[111,1493,1494],{},"zod"," install if nothing else in the agent needs them.",[163,1497,1498,1499,1502,1503,1505,1506,1509,1510,1513,1514,629,1516,629,1518,629,1520,629,1522,629,1524,1489,1526,1489,1528,629,1530,1532],{},"Delete ",[111,1500,1501],{},"agent\u002Ftools\u002Fgithub.ts"," and create ",[111,1504,308],{}," exporting ",[111,1507,1508],{},"githubExtension({ ...same options... })"," instead of ",[111,1511,1512],{},"createGithubTools({ ...same options... })",". Options (",[111,1515,673],{},[111,1517,677],{},[111,1519,680],{},[111,1521,655],{},[111,1523,1107],{},[111,1525,1135],{},[111,1527,1138],{},[111,1529,1141],{},[111,1531,959],{},") are unchanged.",[163,1534,1535,1536,1538,1539,1542,1543,1545,1546,1549],{},"If you used ",[111,1537,1272],{}," from ",[111,1540,1541],{},"@github-tools\u002Fsdk\u002Fconnect\u002Feve",", drop it — pass ",[111,1544,461],{}," directly to ",[111,1547,1548],{},"githubExtension"," instead.",[163,1551,1552,1553,1556,1557,1560,1561,1564,1565,1567,1568,131],{},"If you cherry-picked single-tool factories (e.g. ",[111,1554,1555],{},"listPullRequests()"," exported alone from its own file), replace each ",[111,1558,1559],{},"agent\u002Ftools\u002F*.ts"," file with an ",[111,1562,1563],{},"include: [...]"," list in the single ",[111,1566,308],{}," mount — see ",[103,1569,668],{"href":1058},[100,1571,1572,1573,1576,1577,644,1579,1581],{},"One behavior change to be aware of: tool names gain the ",[111,1574,1575],{},"\u003Cnamespace>__"," prefix described above, so update any code that references tool names by their bare string (",[111,1578,655],{},[111,1580,677],{}," keys stay bare — only the exposed model-facing tool name gets the prefix).",[180,1583,1585],{"id":1584},"eve-extension-vs-direct-import-vs-ai-sdk-vs-workflow-sdk","eve extension vs direct import vs AI SDK vs Workflow SDK",[931,1587,1588,1609],{},[934,1589,1590],{},[937,1591,1592,1594,1596,1600,1604],{},[940,1593],{},[940,1595,31],{},[940,1597,1598],{},[103,1599,36],{"href":37},[940,1601,1602],{},[103,1603,40],{"href":41},[940,1605,1606],{},[103,1607,1608],{"href":46},"Workflow SDK",[950,1610,1611,1634,1653,1671,1701,1717,1747],{},[937,1612,1613,1616,1620,1624,1629],{},[955,1614,1615],{},"Import",[955,1617,1618],{},[111,1619,113],{},[955,1621,1622],{},[111,1623,145],{},[955,1625,1626],{},[111,1627,1628],{},"@github-tools\u002Fsdk",[955,1630,1631],{},[111,1632,1633],{},"@github-tools\u002Fsdk\u002Fworkflow",[937,1635,1636,1639,1643,1647,1650],{},[955,1637,1638],{},"Mount point",[955,1640,1641],{},[111,1642,126],{},[955,1644,1645],{},[111,1646,130],{},[955,1648,1649],{},"anywhere",[955,1651,1652],{},"workflow function",[937,1654,1655,1658,1663,1666,1669],{},[955,1656,1657],{},"Status",[955,1659,1660],{},[137,1661,1662],{},"Recommended",[955,1664,1665],{},"Deprecated",[955,1667,1668],{},"Active",[955,1670,1668],{},[937,1672,1673,1676,1682,1690,1696],{},[955,1674,1675],{},"Tool registration",[955,1677,1678,1681],{},[111,1679,1680],{},"githubExtension()"," mount",[955,1683,1684,1687,1688],{},[111,1685,1686],{},"defineDynamic"," in ",[111,1689,130],{},[955,1691,1692,1695],{},[111,1693,1694],{},"createGithubTools()"," object",[955,1697,1698,1700],{},[111,1699,1694],{}," in workflow",[937,1702,1703,1706,1710,1713,1715],{},[955,1704,1705],{},"Tool naming",[955,1707,1708],{},[111,1709,617],{},[955,1711,1712],{},"bare tool name",[955,1714,1712],{},[955,1716,1712],{},[937,1718,1719,1721,1730,1736,1742],{},[955,1720,1235],{},[955,1722,1723,1119,1726,1729],{},[111,1724,1725],{},"always",[111,1727,1728],{},"once"," \u002F predicates",[955,1731,1732,1119,1734,1729],{},[111,1733,1725],{},[111,1735,1728],{},[955,1737,1738,1739],{},"boolean ",[111,1740,1741],{},"needsApproval",[955,1743,1738,1744,1746],{},[111,1745,1741],{}," (durable pause)",[937,1748,1749,1752,1755,1757,1760],{},[955,1750,1751],{},"Durability",[955,1753,1754],{},"eve session (filesystem-first)",[955,1756,1754],{},[955,1758,1759],{},"in-process",[955,1761,1762,1765],{},[111,1763,1764],{},"\"use workflow\""," steps",[180,1767,1769],{"id":1768},"external-references","External references",[160,1771,1772,1779,1785,1791,1802],{},[163,1773,1774],{},[103,1775,1778],{"href":1776,"rel":1777},"https:\u002F\u002Fvercel.com\u002Fkb\u002Fguide\u002Fgithub-agent-eve",[107],"How to build a GitHub agent with eve and GitHub tools",[163,1780,1781],{},[103,1782,1784],{"href":105,"rel":1783},[107],"eve documentation",[163,1786,1787],{},[103,1788,1790],{"href":117,"rel":1789},[107],"eve extensions",[163,1792,1793,1798,1799,1801],{},[103,1794,1797],{"href":1795,"rel":1796},"https:\u002F\u002Feve.dev\u002Fdocs\u002Fguides\u002Fdynamic-capabilities",[107],"Dynamic capabilities"," (bundled with the ",[111,1800,108],{}," package)",[163,1803,1804],{},[103,1805,1808],{"href":1806,"rel":1807},"https:\u002F\u002Feve.dev\u002Fdocs\u002Ftools\u002Fhuman-in-the-loop",[107],"Human-in-the-loop",[1810,1811,1812],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":197,"searchDepth":211,"depth":211,"links":1814},[1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825],{"id":182,"depth":211,"text":183},{"id":406,"depth":211,"text":407},{"id":467,"depth":211,"text":468},{"id":667,"depth":211,"text":668},{"id":928,"depth":211,"text":929},{"id":1152,"depth":211,"text":1153},{"id":1260,"depth":211,"text":78},{"id":1384,"depth":211,"text":1385},{"id":1465,"depth":211,"text":1466},{"id":1584,"depth":211,"text":1585},{"id":1768,"depth":211,"text":1769},"Mount @github-tools\u002Feve-extension under agent\u002Fextensions\u002F to add all 42 GitHub tools to an eve agent — the recommended way to wire GitHub into eve, with durable approval and Vercel Connect support.",[1828,1833,1837],{"label":1829,"icon":34,"to":394,"target":1830,"color":1831,"variant":1832},"Run the example","_blank","neutral","subtle",{"label":1834,"icon":1835,"to":1836,"target":1830,"color":1831,"variant":1832},"Package README","i-lucide-book-open","https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fgithub-tools\u002Ftree\u002Fmain\u002Fpackages\u002Fgithub-tools-eve-extension",{"label":1257,"icon":1838,"to":63,"color":1831,"variant":1832},"i-lucide-shield-check",{},{"title":31,"icon":34},{"title":95,"description":1842},"Mount @github-tools\u002Feve-extension under agent\u002Fextensions\u002F — the recommended way to add GitHub tools to an eve agent.","vKxiLpCJDrjNVK-bvXLypGGmikE3MePgG8yxDxU0oZ0",[1845,1847],{"title":22,"path":23,"stem":24,"description":1846,"children":-1},"Install the GitHub tools agent skill from github-tools.com for Cursor, Claude Code, and other assistants.",{"title":36,"path":37,"stem":38,"description":1848,"icon":34,"children":-1},"Deprecated — the direct @github-tools\u002Fsdk\u002Feve import registers all 42 tools via defineDynamic with durable human-in-the-loop approval. Prefer the eve extension for new agents.",1785953307348]